{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [],
   "source": [
    "import numpy as np\n",
    "import pandas as pd"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [],
   "source": [
    "rating = pd.read_csv(\"/data/zyang/datasets/ml-1m/ratings.dat\",header=None, sep='::', names=['uid','iid','rating','timestamp'],engine='python')\n",
    "item_info = pd.read_csv(\"/data/zyang/datasets/ml-1m/movies.dat\",sep='::',encoding='latin-1',engine='python',names=['iid','title','genres'])\n",
    "user_info = pd.read_csv(\"/data/zyang/datasets/ml-1m/users.dat\",sep='::',encoding='latin-1',engine='python',names=['uid','gender','age','occupation','zipcode'])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>iid</th>\n",
       "      <th>title</th>\n",
       "      <th>genres</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>1</td>\n",
       "      <td>Toy Story (1995)</td>\n",
       "      <td>Animation|Children's|Comedy</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>2</td>\n",
       "      <td>Jumanji (1995)</td>\n",
       "      <td>Adventure|Children's|Fantasy</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>3</td>\n",
       "      <td>Grumpier Old Men (1995)</td>\n",
       "      <td>Comedy|Romance</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>4</td>\n",
       "      <td>Waiting to Exhale (1995)</td>\n",
       "      <td>Comedy|Drama</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>5</td>\n",
       "      <td>Father of the Bride Part II (1995)</td>\n",
       "      <td>Comedy</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "   iid                               title                        genres\n",
       "0    1                    Toy Story (1995)   Animation|Children's|Comedy\n",
       "1    2                      Jumanji (1995)  Adventure|Children's|Fantasy\n",
       "2    3             Grumpier Old Men (1995)                Comedy|Romance\n",
       "3    4            Waiting to Exhale (1995)                  Comedy|Drama\n",
       "4    5  Father of the Bride Part II (1995)                        Comedy"
      ]
     },
     "execution_count": 3,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "item_info.head()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>uid</th>\n",
       "      <th>gender</th>\n",
       "      <th>age</th>\n",
       "      <th>occupation</th>\n",
       "      <th>zipcode</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>1</td>\n",
       "      <td>F</td>\n",
       "      <td>1</td>\n",
       "      <td>10</td>\n",
       "      <td>48067</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>2</td>\n",
       "      <td>M</td>\n",
       "      <td>56</td>\n",
       "      <td>16</td>\n",
       "      <td>70072</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "   uid gender  age  occupation zipcode\n",
       "0    1      F    1          10   48067\n",
       "1    2      M   56          16   70072"
      ]
     },
     "execution_count": 4,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "user_info.head(2)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [],
   "source": [
    "rating_ = pd.merge(rating,item_info,on='iid',how='inner')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>uid</th>\n",
       "      <th>iid</th>\n",
       "      <th>rating</th>\n",
       "      <th>timestamp</th>\n",
       "      <th>title</th>\n",
       "      <th>genres</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>1</td>\n",
       "      <td>1193</td>\n",
       "      <td>5</td>\n",
       "      <td>978300760</td>\n",
       "      <td>One Flew Over the Cuckoo's Nest (1975)</td>\n",
       "      <td>Drama</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>2</td>\n",
       "      <td>1193</td>\n",
       "      <td>5</td>\n",
       "      <td>978298413</td>\n",
       "      <td>One Flew Over the Cuckoo's Nest (1975)</td>\n",
       "      <td>Drama</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "   uid   iid  rating  timestamp                                   title genres\n",
       "0    1  1193       5  978300760  One Flew Over the Cuckoo's Nest (1975)  Drama\n",
       "1    2  1193       5  978298413  One Flew Over the Cuckoo's Nest (1975)  Drama"
      ]
     },
     "execution_count": 6,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "rating_.head(2)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(Timestamp('2000-04-25 23:05:32'), Timestamp('2003-02-28 17:49:50'))"
      ]
     },
     "execution_count": 7,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "date_min = pd.to_datetime(rating_.timestamp,unit='s').min() \n",
    "date_max = pd.to_datetime(rating_.timestamp,unit='s').max()\n",
    "date_min,date_max"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "38"
      ]
     },
     "execution_count": 8,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "(date_max.year-date_min.year)*12+date_max.month"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {},
   "outputs": [],
   "source": [
    "rating_['time'] = pd.to_datetime(rating_.timestamp,unit='s').map(lambda x: (x.year-date_min.year)*12+x.month)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>uid</th>\n",
       "      <th>iid</th>\n",
       "      <th>rating</th>\n",
       "      <th>timestamp</th>\n",
       "      <th>title</th>\n",
       "      <th>genres</th>\n",
       "      <th>time</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>1</td>\n",
       "      <td>1193</td>\n",
       "      <td>5</td>\n",
       "      <td>978300760</td>\n",
       "      <td>One Flew Over the Cuckoo's Nest (1975)</td>\n",
       "      <td>Drama</td>\n",
       "      <td>12</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>2</td>\n",
       "      <td>1193</td>\n",
       "      <td>5</td>\n",
       "      <td>978298413</td>\n",
       "      <td>One Flew Over the Cuckoo's Nest (1975)</td>\n",
       "      <td>Drama</td>\n",
       "      <td>12</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "   uid   iid  rating  timestamp                                   title  \\\n",
       "0    1  1193       5  978300760  One Flew Over the Cuckoo's Nest (1975)   \n",
       "1    2  1193       5  978298413  One Flew Over the Cuckoo's Nest (1975)   \n",
       "\n",
       "  genres  time  \n",
       "0  Drama    12  \n",
       "1  Drama    12  "
      ]
     },
     "execution_count": 10,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "rating_.head(2)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "metadata": {},
   "outputs": [],
   "source": [
    "rating_['time'] = rating_['time'] - rating_['time'].min()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 16,\n",
       "       17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33,\n",
       "       34])"
      ]
     },
     "execution_count": 12,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "np.sort(rating_.time.unique())"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>uid</th>\n",
       "      <th>iid</th>\n",
       "      <th>rating</th>\n",
       "      <th>timestamp</th>\n",
       "      <th>title</th>\n",
       "      <th>genres</th>\n",
       "      <th>time</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>1</td>\n",
       "      <td>1193</td>\n",
       "      <td>5</td>\n",
       "      <td>978300760</td>\n",
       "      <td>One Flew Over the Cuckoo's Nest (1975)</td>\n",
       "      <td>Drama</td>\n",
       "      <td>8</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>2</td>\n",
       "      <td>1193</td>\n",
       "      <td>5</td>\n",
       "      <td>978298413</td>\n",
       "      <td>One Flew Over the Cuckoo's Nest (1975)</td>\n",
       "      <td>Drama</td>\n",
       "      <td>8</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "   uid   iid  rating  timestamp                                   title  \\\n",
       "0    1  1193       5  978300760  One Flew Over the Cuckoo's Nest (1975)   \n",
       "1    2  1193       5  978298413  One Flew Over the Cuckoo's Nest (1975)   \n",
       "\n",
       "  genres  time  \n",
       "0  Drama     8  \n",
       "1  Drama     8  "
      ]
     },
     "execution_count": 13,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "rating_.head(2)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "<Axes: xlabel='time'>"
      ]
     },
     "execution_count": 14,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAkIAAAG0CAYAAADehEiZAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjcuMCwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy88F64QAAAACXBIWXMAAA9hAAAPYQGoP6dpAABGZklEQVR4nO3df3zO9f7H8ed1za79wIaxzY6xhbCD1GKmH6gdw06ldKKUHylxtmpWfnUc9JP0PaKIU51wOimcpFCTJnzL/FqJZJIfhw4bJRvDxvb+/uG2z9dl19j8mu3zuN9un1td1/v1/nze17XL5/O8Pr8uhzHGCAAAwIacFT0AAACAikIQAgAAtkUQAgAAtkUQAgAAtkUQAgAAtkUQAgAAtkUQAgAAtlWtogdwNSsqKtK+fftUs2ZNORyOih4OAAAoA2OMjhw5orCwMDmd597nQxA6h3379ik8PLyihwEAAC7A3r171aBBg3PWEITOoWbNmpJOv5EBAQEVPBoAAFAWubm5Cg8Pt7bj50IQOofiw2EBAQEEIQAAKpmynNZSrpOlp0+frtatW1vBIDY2Vp999pnVfuLECSUmJiooKEg1atRQz549lZ2d7TaPPXv2KCEhQf7+/goODtawYcN06tQpt5oVK1bohhtukI+Pj5o0aaJZs2aVGMu0adMUEREhX19fxcTEaN26dW7tZRkLAACwt3IFoQYNGmjChAnKyMjQhg0bdNttt+muu+7Sli1bJElDhw7VokWLNH/+fK1cuVL79u3TPffcY/UvLCxUQkKCCgoKtHr1as2ePVuzZs3SmDFjrJpdu3YpISFBnTt31saNG5WcnKxHHnlES5cutWrmzp2rlJQUjR07Vt98842uu+46xcfH68CBA1bN+cYCAAAgc5Fq165t3n77bXP48GHj7e1t5s+fb7Vt3brVSDLp6enGGGM+/fRT43Q6TVZWllUzffp0ExAQYPLz840xxgwfPtz8/ve/d1tGr169THx8vPW4Xbt2JjEx0XpcWFhowsLCzPjx440xpkxjKYucnBwjyeTk5JS5DwAAqFjl2X5f8DlChYWFmj9/vvLy8hQbG6uMjAydPHlScXFxVk3z5s3VsGFDpaenq3379kpPT1erVq0UEhJi1cTHx2vIkCHasmWLrr/+eqWnp7vNo7gmOTlZklRQUKCMjAyNGjXKanc6nYqLi1N6eroklWksnuTn5ys/P996nJube6FvDwDA5goLC3Xy5MmKHkaV5XK5zntpfFmUOwht3rxZsbGxOnHihGrUqKGPPvpIUVFR2rhxo1wul2rVquVWHxISoqysLElSVlaWWwgqbi9uO1dNbm6ujh8/rt9++02FhYUeazIzM615nG8snowfP17PPvts2d4IAAA8MMYoKytLhw8fruihVGlOp1ORkZFyuVwXNZ9yB6FmzZpp48aNysnJ0b///W/169dPK1euvKhBXC1GjRqllJQU63Hx5XcAAJRVcQgKDg6Wv78/N+S9DIpveLx//341bNjwot7jcgchl8ulJk2aSJKio6O1fv16TZkyRb169VJBQYEOHz7sticmOztboaGhkqTQ0NASV3cVX8l1Zs3ZV3dlZ2crICBAfn5+8vLykpeXl8eaM+dxvrF44uPjIx8fn3K8GwAA/L/CwkIrBAUFBVX0cKq0evXqad++fTp16pS8vb0veD4XfXCtqKhI+fn5io6Olre3t9LS0qy2bdu2ac+ePYqNjZUkxcbGavPmzW5Xdy1btkwBAQGKioqyas6cR3FN8TxcLpeio6PdaoqKipSWlmbVlGUsAABcasXnBPn7+1fwSKq+4kNihYWFFzWfcu0RGjVqlLp166aGDRvqyJEjmjNnjlasWKGlS5cqMDBQAwcOVEpKiurUqaOAgAA9/vjjio2NtU5O7tKli6KiovTQQw9p4sSJysrK0ujRo5WYmGjtiRk8eLCmTp2q4cOH6+GHH9by5cs1b948LVmyxBpHSkqK+vXrpxtvvFHt2rXT5MmTlZeXpwEDBkhSmcYCAMDlwuGwy++SvcfluRzt4YcfNo0aNTIul8vUq1fP3H777ebzzz+32o8fP27+/Oc/m9q1axt/f39z9913m/3797vNY/fu3aZbt27Gz8/P1K1b1zz11FPm5MmTbjVffvmladOmjXG5XOaaa64xM2fOLDGW119/3TRs2NC4XC7Trl07s2bNGrf2sozlfLh8HgBQHsePHzc//PCDOX78eEUPpco713tdnu23wxhjLk2kqnpyc3MVGBionJwcfmIDAHBeJ06c0K5duxQZGSlfX9+KHk6FiYiIUHJysnXrm8vhXO91ebbf/NYYAABXQMTIJecvukR2T0i4IsuZNWuWkpOTS9wqYP369apevfoVGcPFIggBAIASCgoKLvgePfXq1bvEo7l8Lv6WjAAAoNLr1KmTkpKSlJycrLp16yo+Pl6TJk1Sq1atVL16dYWHh+vPf/6zjh49Kun0D6QPGDBAOTk5cjgccjgcGjdunKTTh8YmT55szdvhcOjtt9/W3XffLX9/fzVt2lSffPKJ2/I/+eQTNW3aVL6+vurcubNmz54th8Nx2W9MSRACAACSpNmzZ8vlcunrr7/WjBkz5HQ69dprr2nLli2aPXu2li9fruHDh0uSOnTooMmTJysgIED79+/X/v379fTTT5c672effVb33XefNm3apO7du6tPnz46dOiQpNM/uH7vvfeqR48e+u677/TYY4/pL3/5yxV5zRwaQ6V1ruPtV+r4OABUJU2bNtXEiROtx82aNbP+PyIiQi+88IIGDx6sN954Qy6XS4GBgXI4HOe8WXGx/v376/7775ckvfTSS3rttde0bt06de3aVX//+9/VrFkzvfLKK9Zyv//+e7344ouX+BWWRBACAACSTt+Q+ExffPGFxo8fr8zMTOXm5urUqVM6ceKEjh07Vu6bRrZu3dr6/+rVqysgIMC6wfK2bdvUtm1bt/p27dpd4KsoHw6NAQAASXK70mv37t364x//qNatW+vDDz9URkaGpk2bJun0idTldfbPYDgcDhUVFV3cgC8B9ggBAIASMjIyVFRUpL/97W9yOk/vN5k3b55bjcvluuifuJBOHwr79NNP3Z5bv379Rc+3LNgjBAAASmjSpIlOnjyp119/XTt37tS7776rGTNmuNVERETo6NGjSktL0y+//KJjx45d0LIee+wxZWZmasSIEfrxxx81b948zZo1S9Ll/7kSghAAACjhuuuu06RJk/Tyyy+rZcuWeu+99zR+/Hi3mg4dOmjw4MHq1auX6tWr53aidXlERkbq3//+txYsWKDWrVtr+vTp1lVjxb9FernwExvnwE9sXN24agzA1Yaf2Lh0XnzxRc2YMUN79+712M5PbAAAgCrjjTfeUNu2bRUUFKSvv/5ar7zyipKSki77cglCAACgwm3fvl0vvPCCDh06pIYNG+qpp57SqFGjLvtyCUIAAKDCvfrqq3r11Vev+HI5WRoAANgWQQgAANgWQQgAgEvsarhjclV3qS565xwhAAAuEZfLJafTqX379qlevXpyuVyX/YaAdmSM0cGDB+VwOEr8dEd5EYQAALhEnE6nIiMjtX//fu3bt6+ih1OlORwONWjQQF5eXhc1H4IQAACXkMvlUsOGDXXq1KlL8jtc8Mzb2/uiQ5BEEAIA4JIrPmRzsYdtcPlxsjQAALAtghAAALAtghAAALAtghAAALAtghAAALAtghAAALAtghAAALAtghAAALAtghAAALAtghAAALAtghAAALAtghAAALAtghAAALAtghAAALAtghAAALAtghAAALAtghAAALAtghAAALAtghAAALAtghAAALAtghAAALAtghAAALAtghAAALAtghAAALAtghAAALAtghAAALAtghAAALAtghAAALCtcgWh8ePHq23btqpZs6aCg4PVo0cPbdu2za2mU6dOcjgcbtPgwYPdavbs2aOEhAT5+/srODhYw4YN06lTp9xqVqxYoRtuuEE+Pj5q0qSJZs2aVWI806ZNU0REhHx9fRUTE6N169a5tZ84cUKJiYkKCgpSjRo11LNnT2VnZ5fnJQMAgCqsXEFo5cqVSkxM1Jo1a7Rs2TKdPHlSXbp0UV5enlvdo48+qv3791vTxIkTrbbCwkIlJCSooKBAq1ev1uzZszVr1iyNGTPGqtm1a5cSEhLUuXNnbdy4UcnJyXrkkUe0dOlSq2bu3LlKSUnR2LFj9c033+i6665TfHy8Dhw4YNUMHTpUixYt0vz587Vy5Urt27dP99xzT7nfJAAAUDU5jDHmQjsfPHhQwcHBWrlypW699VZJp/cItWnTRpMnT/bY57PPPtMf//hH7du3TyEhIZKkGTNmaMSIETp48KBcLpdGjBihJUuW6Pvvv7f69e7dW4cPH1ZqaqokKSYmRm3bttXUqVMlSUVFRQoPD9fjjz+ukSNHKicnR/Xq1dOcOXN07733SpIyMzPVokULpaenq3379ud9fbm5uQoMDFROTo4CAgIu9G3CZRIxckmpbbsnJFzBkQAAribl2X5f1DlCOTk5kqQ6deq4Pf/ee++pbt26atmypUaNGqVjx45Zbenp6WrVqpUVgiQpPj5eubm52rJli1UTFxfnNs/4+Hilp6dLkgoKCpSRkeFW43Q6FRcXZ9VkZGTo5MmTbjXNmzdXw4YNrZqz5efnKzc3120CAABVV7UL7VhUVKTk5GTddNNNatmypfX8Aw88oEaNGiksLEybNm3SiBEjtG3bNi1YsECSlJWV5RaCJFmPs7KyzlmTm5ur48eP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a+vWrRoyZIjy8vI0YMCAS/2SAQBAJXXJzxH6+eefdf/99+vXX39VvXr1dPPNN2vNmjWqV6+eJOnVV1+V0+lUz549lZ+fr/j4eL3xxhtWfy8vLy1evFhDhgxRbGysqlevrn79+um5556zaiIjI7VkyRINHTpUU6ZMUYMGDfT2229b9xCSpF69eungwYMaM2aMsrKy1KZNG6WmppY4gRoAANjXJQ9CH3zwwTnbfX19NW3aNE2bNq3UmkaNGunTTz8953w6deqkb7/99pw1SUlJSkpKOmcNAACwL35rDAAA2BZBCAAA2NZl+a0xoDz4jTIAQEVhjxAAALAtghAAALAtghAAALAtghAAALAtghAAALAtghAAALAtghAAALAtghAAALAtghAAALAtghAAALAtghAAALAtghAAALAtghAAALAtghAAALAtghAAALAtghAAALAtghAAALAtghAAALAtghAAALAtghAAALAtghAAALAtghAAALAtghAAALAtghAAALAtghAAALAtghAAALAtghAAALAtghAAALCtahU9AKCyiBi55JztuyckXKGRAAAuFfYIAQAA2yIIAQAA2yIIAQAA2yIIAQAA2yIIAQAA2yIIAQAA2yIIAQAA2+I+QuV0rnvJcB8ZAAAqF/YIAQAA2yIIAQAA2yIIAQAA2+IcIeAK4NwyALg6sUcIAADYFkEIAADYFofGgKsYh9QA4PIiCAFV0IUGqKup3/n6AsClQBACUCmxtwzApWCLIDRt2jS98sorysrK0nXXXafXX39d7dq1q+hhAagAlSVAsZcNuDKqfBCaO3euUlJSNGPGDMXExGjy5MmKj4/Xtm3bFBwcXNHDA1BJXOnDhhXhajo0erW9NxfKDq+xsqvyQWjSpEl69NFHNWDAAEnSjBkztGTJEr3zzjsaOXJkBY8OAFBeFRG8rnSgqSzLq4j39FK/N1U6CBUUFCgjI0OjRo2ynnM6nYqLi1N6enqJ+vz8fOXn51uPc3JyJEm5ubnWc0X5x0pd3pl1Z6ss/SpimVWhX0Uss6r3q4hlVvV+FbHMqtCvIpZ5of1ajl1aatv3z8Zf8uVdre9p8X+NMeccQ3FRlfXf//7XSDKrV692e37YsGGmXbt2JerHjh1rJDExMTExMTFVgWnv3r3nzQpVeo9QeY0aNUopKSnW46KiIh06dEhBQUFyOBxu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8//5z388thUVFZmdO3eakydPGmNOryM/+OADM3v2bLd/22XRuXPnC/53XYwgVAa+vr5m69atpbZv3brV+Pr6emwr7R988fTqq696XMn06NHDJCQkmIMHD5rt27ebhIQEExkZaX2wSls5xcbGmr/85S/GGGPef/99U7t2bfPMM89Y7SNHjjR/+MMfSvQbP368iYyMLBGSqlWrZrZs2VLqa3c4HNZKuU+fPqZDhw7m8OHDxhhjjhw5YuLi4sz9999fop+fn5/14b3++uvNm2++6db+3nvvmaioqFKX+cUXX5gnn3zS1K1b13h7e5s777zTLFq0qNR/lMYY07hxY/Phhx8aY05vFLy8vMy//vUvq33BggWmSZMmHse6Y8cO63FhYaHx9vY2WVlZxhhjPv/8cxMWFuZxmdu3bzfXXHON8fX1NR07djT33Xefue+++0zHjh2Nr6+vadKkidm+fXupYy5NaRu1ffv2mbZt2xqn02m8vLzMQw895LZhKO1zs3btWhMYGGgcDoepXbu22bBhg4mMjDRNmzY1jRs3Nn5+fiYjI6NEvylTpnicvLy8zKhRo6zHnnTr1s36rPz6668mJibGOBwOU69ePeN0Ok3z5s3NgQMHSvRr166dWbRokTHGmIULFxqn02nuvPNOM2LECHP33Xcbb29vq/1MDofDeHl5mbi4OPPBBx+UOYTOmDHDVKtWzURHR5uAgADz7rvvmpo1a5pHHnnEPPbYY8bPz89Mnjy5RL/t27ebRo0ameDgYBMeHm4cDodJSEgwMTExxsvLy/zpT3+yNgRn6tmzp4mNjTWZmZkl2jIzM02HDh3MvffeW6ItJyfnnNP//u//evzbP/HEE+baa6818+fPN2+99ZZp1KiRSUhIsN6frKws43A4SvS76667zJ133mk2bdpkkpOTTYsWLcxdd91lCgoKzIkTJ8wdd9xhHnzwQY/vaXFwcTgcpU6exup0Oq31zahRo0yDBg3M8uXLTV5envnqq69M48aNzciRI0v0CwgIsEJZx44dzdChQ93aR48ebW666SaP43zuuefM9ddfbxwOh/n9739vXn31VfPLL794fF3FbrjhBvPCCy8YY06vh2vVqmWee+45q/1//ud/TJs2bUr069Wrl+nRo4fJyckxJ06cMElJSaZv377GmNPhOygoyONnzZiqH6AvNDyXBUGoDCIiIs6ZiGfPnm0aNWrkse1C/8EHBwebTZs2WY+LiorM4MGDTcOGDc2OHTtK/ZAFBARYG9bCwkJTrVo1880331jtmzdvNiEhIR7Hum7dOnPttdeap556yvo2Xp4gdM0115jPP//crf3rr7824eHhJfoFBQWZDRs2WK9148aNbu0//fST8fPzO+8yCwoKzNy5c61vWWFhYeaZZ57xGC78/PzcvqF4e3ub77//3nq8e/du4+/vX6Jfo0aNrD0BxpwOGw6Hwxw7dswYY8yuXbtKDcJxcXHmrrvuMjk5OSXacnJyzF133WW6dOlSou2777475zR37lyPf/++ffuamJgYs379erNs2TITHR1tbrzxRnPo0CFjTOkbtbi4OPPII4+Y3Nxc88orr5gGDRqYRx55xGofMGCA6dGjR4l+DofDNGjQwERERLhNDofD/O53vzMREREmMjLS43tz5t9xyJAhJioqytp7uHfvXhMdHW0GDx5col/16tWtupiYGDNhwgS39tdff91cf/31Hpc3c+ZMc9dddxlvb28TFBRknnzySbN582aP4ysWFRVlBfXly5cbX19fM23aNKt95syZpkWLFiX6devWzTz22GPWnuQJEyaYbt26GWOM+fHHH01ERIQZO3ZsiX41atRw+zd7tg0bNpgaNWp4fH1Op7PUqbR1TcOGDc2XX35pPT548KBp166d6dKlizlx4kSp65p69eqZb7/91hhjzNGjR43D4TD/+7//a7V//fXXpmHDhh5fQ9euXU1CQkKJDXN51jctW7Y0c+bMcWv/+OOPzbXXXluiX/Xq1a0vsyEhIR7XN6W9p8XL27BhgxkyZIipVauW8fHxMX/6059KrO/OXN6uXbuMMafX3d7e3m7r8x07dnhcXkBAgNs66ejRo8bb29taf7z77rumWbNmHpdZ1QP0hW5Ly4IgVAZTp041Pj4+5oknnjAff/yxWbNmjVmzZo35+OOPzRNPPGH8/PzcVoxnCgsLMwsXLix13t9++63HP17NmjU9Ho5ITEw0DRo0MKtWrSo1CP3000/W4xo1arjtzdi9e3epG21jTu/F6du3r2ndurXZvHmz8fb2Pu+Kqfhbe1hYWImNSmnLe/DBB83AgQONMcb86U9/MqNHj3Zrf+mll0yrVq1KXaanbzb/+c9/zNixY61vG2eLjIw0n332mTHm9IbI6XSaefPmWe1LliwxERERJfo9+eSTpmXLluazzz4zy5cvN507dzadOnWy2lNTU03jxo09jtXPz++cG9pNmzZ5DHzn+kd/ro1aWFiY227w4hVLmzZtzK+//lrqRq127drW562goMA4nU63+WRkZJjf/e53Jfo99thjpk2bNiU+q+fboBW/xuK/Y7NmzUp8m/viiy88hqjAwEDz3XffGWNOh+ji/y/2008/eQy0Zy4vOzvbvPzyy6Z58+bG6XSatm3bmjfffNPk5uaW6OcpQJ/5N921a5fH5fn7+7t9s83Pzzfe3t7W3oSFCxd6/LwFBQWZFStWlHi+2JdffmmCgoJKPB8QEGBefvlls2LFCo/TW2+95fFv7+fnV+LwdW5uromNjTW33Xab2blzZ6n9znxfatSo4bbu2bNnj/Hx8Sn1dUyaNMmEh4e77b0rSxAqXt/UrVvXLTQYc3p94+nf02233WYmTpxojDGmQ4cOJb7Y/vvf//YY2jyta44fP27++c9/mk6dOhmn0+nxbxgaGmp90Tt06JBxOBxuYXPdunUmNDS0RL969eq5vf5jx44Zp9NpHa7esWNHqe9pVQ/QFxqey4IgVEYffPCBiYmJMdWqVbM2SNWqVTMxMTFm7ty5pfa74447zF//+tdS2zdu3OgxNbdt29b885//9NgnMTHR1KpVy+OHrHXr1tbG3pjTe4DO3P2+atWqUr+hn+n99983ISEhxul0nnfF1KpVK3P99debGjVqmH//+99u7StXrvS4Af3vf/9rIiIizK233mpSUlKMn5+fufnmm82jjz5qbr31VuNyucySJUtKXea5dvEWFRV5/KY2evRoU69ePfPII4+YyMhIM3LkSNOwYUMzffp0M2PGDBMeHl5il7kxp8PhfffdZ/3tO3To4LbhWLp0qVugOlP9+vU9HqYp9sknn5j69euXeD4oKMj84x//MLt37/Y4LVmyxOPfv3r16iV2K588edL06NHDtG7d2mzatKnUfsXfYI0pGaD/85//lBqgFyxYYMLDw83rr79uPVfWIFS8UQsODva4UfO00r/zzjutwx/x8fElDr299dZbpmnTph6X5+lzs2rVKtOvXz9TvXp1U7169RLtxV88jDn9uXU4HG6fzRUrVpgGDRqU6BcWFuZ2OPG3334zDofDCls7d+70+Pr+/Oc/m0aNGpkFCxa47UnMyckxCxYsMBERESYpKalEv06dOpmXX365xPPFSlvXNGvWzOO/tSNHjpjY2Fhz3XXXefzMNG7c2G0D9sYbb7gFyYyMDI8b+zN9++23JioqygwaNMjk5eWVKQg99thjZujQoSY4OLjEv/OMjAxTt27dEv1Wr15tAgMDzdixY83rr79u6tata0aPHm3ee+89M2bMGFOrVi2P792Zh+I82b59u9upB8UefPBBExMTY/71r3+ZO+64w8THx5v27dubrVu3mszMTNOxY0ePe2fuvvtu07NnT3P06FFTUFBgkpOT3Q7Xr1mzptT31A4B+kLCc1kQhMqpoKDA7Nu3z+zbt6/UkznPtGrVKrdgcrajR496/PC+9NJL1m50T4YMGeJxpTZ9+nSzePHiUvuNGjXK2hNzPnv37jULFy40R48eLbVm3LhxblNqaqpb+9NPP2169+7tse9vv/1mRowYYaKiooyvr69xuVymUaNG5oEHHjDr168vdZkRERHnPUbvSWFhoXnxxRfNH//4R/PSSy+ZoqIi8/7775vw8HATFBRk+vfvf87Xevz4cY8nYp7LX//6V1O7dm0zadIk891335msrCyTlZVlvvvuOzNp0iRTp04dj4dHunTpYp5//vlS51vaRq1Vq1Ylwqgx/x+GGjZs6HHl1Lx5c7fzwxYvXmwd+jPm9ArY08a+2M8//2xuu+0207VrV7N///4yB6Hu3bubu+++29SuXbtEYFyzZo3Hw7g//PCDCQoKMn379jXPP/+8qVGjhnnwwQfNiy++aPr27Wt8fHzMzJkzS/Q730YtJyenxLlqxpz+4tG0aVPzwgsvmHbt2pl+/fqZ5s2bm88++8ykpqaaVq1amYcffrhEv379+pmOHTuarVu3mp07d1on5hZbsWKFx8PGJ06cMIMHDzYul8s4nU7j6+trfH19jdPpNC6XywwZMsScOHGiRL8333yz1POxjDl9qOLMk/6LPf744x43ysac3rDFxMR4/Mw89thj5q233ip1eePHjzfdu3cvtb3YsWPHzGOPPWaaNm1qvLy8zvm56dixo9vFHGcv//nnnzcdO3b02Hf16tWmffv2Jfaw/u53vyv1vJvzfekqTVZWlvnDH/5gatSoYeLj483hw4dNUlKS24UeZ278i+3YscM0btzYVKtWzXh7e5tatWpZF5UYc/owrKdzoIyxT4Aub3guC4IQcJlNmDDB1K9f320XtMPhMPXr1y91BbRgwQLz7rvvljrPQ4cOmVmzZpV4fvjw4R7POTLmdBi68847Pa7Uxo0bZ95///1Sl/fMM8+Ye+65p9R2Y07viXvppZesK1zOt3Lq37+/23T2ntVhw4aZ+Ph4j31/+ukn07t3b1OzZk1rg+bt7W06dOhgPvroI499LnSjdvToUfPoo4+ali1bmkGDBpn8/HzzyiuvGJfLZRwOh+nUqZPH+WZnZ1sbXqfTaRo1auR26GL+/PnmtddeK3W5OTk5Zvny5WbOnDlmzpw5Zvny5R7PNbtYhw4dKrE37ky5ubnn3NNQmp07d7pd6Xo+H3/8sUlOTr6gv1GxHTt2mL17956z5sCBA2bNmjVm9erVbntBPdm9e7fHq4UvZnxn76U/W15enlm6dKlZtGhRua6gupgAXVoQNObqDNDlCc9lwX2EgCtk165dbveE8XTfkot16tQpHTt2TAEBAaW2//e//y3XfVok6dixY/Ly8pKPj895azMyMvTVV1+pb9++ql27drmWc6a8vDx5eXnJ19e31BpjjA4cOKCioiLVrVvXuk/MlXDixAmdPHnyvPeP2r59u/Lz89W8efMS96gCLrXc3FxlZGS4rWuio6NLXSdcqN9++0379u3T73//e4/tR44c0TfffKOOHTuWa767du2Sr6+v6tevf97aTz75RF9++aVGjRql4ODgci3nTPzEBnCFREZGKjY2VrGxsVYI2rt3rx5++OFyz6u0ftWqVTvnCm///v169tlny728X3/9VUOGDClTbXR0tJ588knVrl37gl+fJB06dEh//vOfz1njcDgUEhKi+vXrWyHoUr+npfH19VXNmjXP269p06Zq2bJliRB0rn7Hjx/XV199pR9++KFE24kTJ/TPf/6zUverTGOtLP2k0zfT/fDDD62b2V5//fWaN2+ekpOTtXz58nP2mzlzpjIzMyVJmZmZGjJkiB5++OFS+9WuXVtOp7PUfuvXry81BJ1rebt27So1BJ3d79prr9Xx48c1cuTIc76+87qo/UkALkpp9+iwe7+KWObV0s/TzVT/+9//Wu2lXY1zoTdhvdL9KtNYK0s/Yy78ZrpVvV9ZsJ8WuIw++eSTc7bv3LnTlv0qYpmVpd+IESPUsmVLbdiwQYcPH1ZycrJuvvlmrVixwuPPXJyr30033XTV9atMY60s/STpueee07Bhw/TCCy/ogw8+0AMPPKAhQ4boxRdflCSNGjVKEyZMKPETS1W9X5lcUHwCUCYXehOwqt6vMo31Sve70JupVpZ+lWmslaWfMRd+M92q3q8sOEcIuIzq16+vBQsWqKioyOP0zTff2LJfZRrrle53/Phxt/OJHA6Hpk+frjvuuEMdO3bUjz/+WKn7VaaxVpZ+Z9ZLktPplK+vrwIDA622mjVrKicnx5b9zocgBFxG0dHRysjIKLXd4XDIeLhws6r3q0xjvdL9mjdvrg0bNpR4furUqbrrrrt05513epxfZelXmcZaWfpJUkREhLZv3249Tk9PdzuctmfPHo8nIVf1fmVyQfuRAJTJhd5Qs6r3q0xjvdL9LvRmqpWlX2Uaa2XpZ8yF30y3qvcrC+4jBAAAbItDYwAAwLYIQgAAwLYIQgAAwLYIQgAAwLYIQgCqnBUrVsjhcOjw4cMVPRQAVzmuGgNQ6XXq1Elt2rTR5MmTJUkFBQU6dOiQQkJCrJuwAYAn/NYYgCrH5XIpNDS0oocBoBLg0BiASq1///5auXKlpkyZIofDIYfDoVmzZrkdGps1a5Zq1aqlxYsXq1mzZvL399e9996rY8eOafbs2YqIiFDt2rX1xBNPqLCw0Jp3fn6+nn76af3ud79T9erVFRMToxUrVlTMCwVwWbBHCEClNmXKFP34449q2bKlnnvuOUnSli1bStQdO3ZMr732mj744AMdOXJE99xzj+6++27VqlVLn376qXbu3KmePXvqpptuUq9evSRJSUlJ+uGHH/TBBx8oLCxMH330kbp27arNmzeradOmV/R1Arg8CEIAKrXAwEC5XC75+/tbh8MyMzNL1J08eVLTp09X48aNJUn33nuv3n33XWVnZ6tGjRqKiopS586d9eWXX6pXr17as2ePZs6cqT179igsLEyS9PTTTys1NVUzZ87USy+9dOVeJIDLhiAEwBb8/f2tECRJISEhioiIUI0aNdyeO3DggCRp8+bNKiws1LXXXus2n/z8fAUFBV2ZQQO47AhCAGzB29vb7bHD4fD4XFFRkSTp6NGj8vLyUkZGhry8vNzqzgxPACo3ghCASs/lcrmd5HwpXH/99SosLNSBAwd0yy23XNJ5A7h6cNUYgEovIiJCa9eu1e7du/XLL79Ye3UuxrXXXqs+ffqob9++WrBggXbt2qV169Zp/PjxWrJkySUYNYCrAUEIQKX39NNPy8vLS1FRUapXr5727NlzSeY7c+ZM9e3bV0899ZSaNWumHj16aP369WrYsOElmT+AisedpQEAgG2xRwgAANgWQQgAANgWQQgAANgWQQgAANgWQQgAANgWQQgAANgWQQgAANgWQQgAANgWQQgAANgWQQgAANgWQQgAANjW/wEK2l14PQJCowAAAABJRU5ErkJggg==",
      "text/plain": [
       "<Figure size 640x480 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "rating_.groupby('time').agg({'rating':'count'}).reset_index().plot(x='time',kind='bar')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 15,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>uid</th>\n",
       "      <th>iid</th>\n",
       "      <th>rating</th>\n",
       "      <th>timestamp</th>\n",
       "      <th>title</th>\n",
       "      <th>genres</th>\n",
       "      <th>time</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>1</td>\n",
       "      <td>1193</td>\n",
       "      <td>5</td>\n",
       "      <td>978300760</td>\n",
       "      <td>One Flew Over the Cuckoo's Nest (1975)</td>\n",
       "      <td>Drama</td>\n",
       "      <td>8</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>2</td>\n",
       "      <td>1193</td>\n",
       "      <td>5</td>\n",
       "      <td>978298413</td>\n",
       "      <td>One Flew Over the Cuckoo's Nest (1975)</td>\n",
       "      <td>Drama</td>\n",
       "      <td>8</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "   uid   iid  rating  timestamp                                   title  \\\n",
       "0    1  1193       5  978300760  One Flew Over the Cuckoo's Nest (1975)   \n",
       "1    2  1193       5  978298413  One Flew Over the Cuckoo's Nest (1975)   \n",
       "\n",
       "  genres  time  \n",
       "0  Drama     8  \n",
       "1  Drama     8  "
      ]
     },
     "execution_count": 15,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "rating_.head(2)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 16,
   "metadata": {},
   "outputs": [],
   "source": [
    "train_slot = list(range(14,24))\n",
    "valid_slot = list(range(24,29))\n",
    "test_slot = list(range(29,34))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 17,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>uid</th>\n",
       "      <th>iid</th>\n",
       "      <th>rating</th>\n",
       "      <th>timestamp</th>\n",
       "      <th>title</th>\n",
       "      <th>genres</th>\n",
       "      <th>time</th>\n",
       "      <th>label</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>1</td>\n",
       "      <td>1193</td>\n",
       "      <td>5</td>\n",
       "      <td>978300760</td>\n",
       "      <td>One Flew Over the Cuckoo's Nest (1975)</td>\n",
       "      <td>Drama</td>\n",
       "      <td>8</td>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>2</td>\n",
       "      <td>1193</td>\n",
       "      <td>5</td>\n",
       "      <td>978298413</td>\n",
       "      <td>One Flew Over the Cuckoo's Nest (1975)</td>\n",
       "      <td>Drama</td>\n",
       "      <td>8</td>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>12</td>\n",
       "      <td>1193</td>\n",
       "      <td>4</td>\n",
       "      <td>978220179</td>\n",
       "      <td>One Flew Over the Cuckoo's Nest (1975)</td>\n",
       "      <td>Drama</td>\n",
       "      <td>8</td>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>15</td>\n",
       "      <td>1193</td>\n",
       "      <td>4</td>\n",
       "      <td>978199279</td>\n",
       "      <td>One Flew Over the Cuckoo's Nest (1975)</td>\n",
       "      <td>Drama</td>\n",
       "      <td>8</td>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>17</td>\n",
       "      <td>1193</td>\n",
       "      <td>5</td>\n",
       "      <td>978158471</td>\n",
       "      <td>One Flew Over the Cuckoo's Nest (1975)</td>\n",
       "      <td>Drama</td>\n",
       "      <td>8</td>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "   uid   iid  rating  timestamp                                   title  \\\n",
       "0    1  1193       5  978300760  One Flew Over the Cuckoo's Nest (1975)   \n",
       "1    2  1193       5  978298413  One Flew Over the Cuckoo's Nest (1975)   \n",
       "2   12  1193       4  978220179  One Flew Over the Cuckoo's Nest (1975)   \n",
       "3   15  1193       4  978199279  One Flew Over the Cuckoo's Nest (1975)   \n",
       "4   17  1193       5  978158471  One Flew Over the Cuckoo's Nest (1975)   \n",
       "\n",
       "  genres  time  label  \n",
       "0  Drama     8      1  \n",
       "1  Drama     8      1  \n",
       "2  Drama     8      1  \n",
       "3  Drama     8      1  \n",
       "4  Drama     8      1  "
      ]
     },
     "execution_count": 17,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "rating_['label'] = rating_['rating'].apply(lambda x: 1 if x>=4 else 0)\n",
    "rating_.head(5)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 18,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "count    1.000209e+06\n",
       "mean     5.751608e-01\n",
       "std      4.943188e-01\n",
       "min      0.000000e+00\n",
       "25%      0.000000e+00\n",
       "50%      1.000000e+00\n",
       "75%      1.000000e+00\n",
       "max      1.000000e+00\n",
       "Name: label, dtype: float64"
      ]
     },
     "execution_count": 18,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "rating_.label.describe()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 19,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(1, 6040, 1, 3952)"
      ]
     },
     "execution_count": 19,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "rating_.uid.min(),rating_.uid.max(),rating_.iid.min(),rating_.iid.max()"
   ]
  },
  {
   "attachments": {},
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## split by time order"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 20,
   "metadata": {},
   "outputs": [],
   "source": [
    "rating_train = rating_[rating_['time'].isin(train_slot)].copy()\n",
    "rating_valid = rating_[rating_['time'].isin(valid_slot)].copy()\n",
    "rating_test = rating_[rating_['time'].isin(test_slot)].copy()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 21,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "((33891, 8), (10401, 8), (7331, 8))"
      ]
     },
     "execution_count": 21,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "rating_train.shape, rating_valid.shape, rating_test.shape"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 22,
   "metadata": {},
   "outputs": [],
   "source": [
    "rating_valid_f = rating_valid\n",
    "rating_test_f = rating_test"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 23,
   "metadata": {},
   "outputs": [],
   "source": [
    "def filter_cold_start(train,valid,test):\n",
    "    train_user = train.uid.unique()\n",
    "    train_item = train.iid.unique()\n",
    "    valid = valid[valid['uid'].isin(train_user)]\n",
    "    test = test[test['uid'].isin(train_user)]\n",
    "    valid = valid[valid['iid'].isin(train_item)]\n",
    "    test = test[test['iid'].isin(train_item)]\n",
    "    return valid, test"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 24,
   "metadata": {},
   "outputs": [],
   "source": [
    "# rating_valid_f, rating_test_f = filter_cold_start(rating_train,rating_valid,rating_test)\n",
    "# rating_valid_f.shape, rating_test_f.shape"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 25,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(0.5283145851360446, 0.5453553403355613)"
      ]
     },
     "execution_count": 25,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "rating_valid_f.label.mean(), rating_test_f.label.mean() "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 26,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "Index(['uid', 'iid', 'rating', 'timestamp', 'title', 'genres', 'time',\n",
       "       'label'],\n",
       "      dtype='object')"
      ]
     },
     "execution_count": 26,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "rating_valid_f.columns"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 27,
   "metadata": {},
   "outputs": [],
   "source": [
    "import copy\n",
    "def deal_with_each_u(x,u):\n",
    "    items = np.array(x.iid)\n",
    "    labels = np.array(x.label)\n",
    "    titles = np.array(x.title)\n",
    "    timestamp = np.array(x.timestamp)\n",
    "    flags =  np.array(x.flag) \n",
    "    his = [0] # adding a '0' by default\n",
    "    his_title = ['']\n",
    "    results = []\n",
    "    for i in range(items.shape[0]):\n",
    "        results.append((u, items[i], timestamp[i], np.array(his), copy.copy(his_title),titles[i], labels[i], flags[i]))\n",
    "        # training data\n",
    "        if labels[i] > 0: # positive \n",
    "            his.append(items[i])\n",
    "            his_title.append(titles[i])\n",
    "    return results"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 28,
   "metadata": {},
   "outputs": [],
   "source": [
    "rating_train = rating_train.copy()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 29,
   "metadata": {},
   "outputs": [],
   "source": [
    "rating_train['flag'] =  pd.DataFrame(np.ones(rating_train.shape[0])*-1, index=rating_train.index)\n",
    "rating_valid_f['flag'] = pd.DataFrame(np.zeros(rating_valid_f.shape[0]), index=rating_valid_f.index)\n",
    "rating_test_f['flag'] = pd.DataFrame(np.ones(rating_test_f.shape[0]), index=rating_test_f.index)\n",
    "data = pd.concat([rating_train, rating_valid_f, rating_test_f],axis=0,ignore_index=True)\n",
    "data = data.sort_values(by=['uid','timestamp'])\n",
    "u_inter_all = data.groupby('uid').agg({'iid':list, 'label':list, 'title':list, 'timestamp':list,'flag':list})\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 30,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([-1.,  1.,  0.])"
      ]
     },
     "execution_count": 30,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "data.flag.unique()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 31,
   "metadata": {},
   "outputs": [],
   "source": [
    "results = []\n",
    "for u in u_inter_all.index:\n",
    "    results.extend(deal_with_each_u(u_inter_all.loc[u],u))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 32,
   "metadata": {},
   "outputs": [],
   "source": [
    "u_, i_, time_, label_, his_, his_title, title_,flag_ = [],[],[],[],[],[],[],[]\n",
    "for re_ in results:\n",
    "    u_.append(re_[0])\n",
    "    i_.append(re_[1])\n",
    "    time_.append(re_[2])\n",
    "    his_.append(re_[3])\n",
    "    his_title.append(re_[4])\n",
    "    title_.append(re_[5])\n",
    "    label_.append(re_[6])\n",
    "    flag_.append(re_[7])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 33,
   "metadata": {},
   "outputs": [],
   "source": [
    "data = pd.DataFrame({\"uid\":u_,'iid':i_,'label':label_, 'timestamp': time_ , 'his':his_,'his_title':his_title,'title':title_, 'flag': flag_})\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 34,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>uid</th>\n",
       "      <th>iid</th>\n",
       "      <th>label</th>\n",
       "      <th>timestamp</th>\n",
       "      <th>his</th>\n",
       "      <th>his_title</th>\n",
       "      <th>title</th>\n",
       "      <th>flag</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>19</td>\n",
       "      <td>318</td>\n",
       "      <td>1</td>\n",
       "      <td>994556598</td>\n",
       "      <td>[0]</td>\n",
       "      <td>[]</td>\n",
       "      <td>Shawshank Redemption, The (1994)</td>\n",
       "      <td>-1.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>19</td>\n",
       "      <td>1234</td>\n",
       "      <td>1</td>\n",
       "      <td>994556636</td>\n",
       "      <td>[0, 318]</td>\n",
       "      <td>[, Shawshank Redemption, The (1994)]</td>\n",
       "      <td>Sting, The (1973)</td>\n",
       "      <td>-1.0</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "   uid   iid  label  timestamp       his  \\\n",
       "0   19   318      1  994556598       [0]   \n",
       "1   19  1234      1  994556636  [0, 318]   \n",
       "\n",
       "                              his_title                             title  \\\n",
       "0                                    []  Shawshank Redemption, The (1994)   \n",
       "1  [, Shawshank Redemption, The (1994)]                 Sting, The (1973)   \n",
       "\n",
       "   flag  \n",
       "0  -1.0  \n",
       "1  -1.0  "
      ]
     },
     "execution_count": 34,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "data.head(2)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 35,
   "metadata": {},
   "outputs": [],
   "source": [
    "users = data.uid.unique()\n",
    "items = data.iid.unique()\n",
    "users_map = dict(zip(users, np.arange(users.shape[0])+1))\n",
    "items_map = dict(zip(items, np.arange(items.shape[0])+1))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 36,
   "metadata": {},
   "outputs": [],
   "source": [
    "users_map[0]=0\n",
    "items_map[0]=0"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 37,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>uid</th>\n",
       "      <th>iid</th>\n",
       "      <th>label</th>\n",
       "      <th>timestamp</th>\n",
       "      <th>his</th>\n",
       "      <th>his_title</th>\n",
       "      <th>title</th>\n",
       "      <th>flag</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>1</td>\n",
       "      <td>1</td>\n",
       "      <td>1</td>\n",
       "      <td>994556598</td>\n",
       "      <td>[0]</td>\n",
       "      <td>[]</td>\n",
       "      <td>Shawshank Redemption, The (1994)</td>\n",
       "      <td>-1.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>1</td>\n",
       "      <td>2</td>\n",
       "      <td>1</td>\n",
       "      <td>994556636</td>\n",
       "      <td>[0, 318]</td>\n",
       "      <td>[, Shawshank Redemption, The (1994)]</td>\n",
       "      <td>Sting, The (1973)</td>\n",
       "      <td>-1.0</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "   uid  iid  label  timestamp       his                             his_title  \\\n",
       "0    1    1      1  994556598       [0]                                    []   \n",
       "1    1    2      1  994556636  [0, 318]  [, Shawshank Redemption, The (1994)]   \n",
       "\n",
       "                              title  flag  \n",
       "0  Shawshank Redemption, The (1994)  -1.0  \n",
       "1                 Sting, The (1973)  -1.0  "
      ]
     },
     "execution_count": 37,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "data['uid'] = data['uid'].map(users_map)\n",
    "data['iid'] = data['iid'].map(items_map)\n",
    "data.head(2)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 38,
   "metadata": {},
   "outputs": [],
   "source": [
    "data['his'] = data['his'].apply(lambda x: [items_map[k] for k in x])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 39,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "count    51623.000000\n",
       "mean         0.536273\n",
       "std          0.498687\n",
       "min          0.000000\n",
       "25%          0.000000\n",
       "50%          1.000000\n",
       "75%          1.000000\n",
       "max          1.000000\n",
       "Name: label, dtype: float64"
      ]
     },
     "execution_count": 39,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "data.label.describe()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 40,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>uid</th>\n",
       "      <th>iid</th>\n",
       "      <th>label</th>\n",
       "      <th>timestamp</th>\n",
       "      <th>his</th>\n",
       "      <th>his_title</th>\n",
       "      <th>title</th>\n",
       "      <th>flag</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>51618</th>\n",
       "      <td>838</td>\n",
       "      <td>1619</td>\n",
       "      <td>1</td>\n",
       "      <td>997454429</td>\n",
       "      <td>[0, 575, 1633, 742, 17, 1894, 1050, 848, 236, ...</td>\n",
       "      <td>[, Dreamlife of Angels, The (La Vie rêvée des ...</td>\n",
       "      <td>Body Heat (1981)</td>\n",
       "      <td>-1.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>51619</th>\n",
       "      <td>838</td>\n",
       "      <td>407</td>\n",
       "      <td>0</td>\n",
       "      <td>997454464</td>\n",
       "      <td>[0, 575, 1633, 742, 17, 1894, 1050, 848, 236, ...</td>\n",
       "      <td>[, Dreamlife of Angels, The (La Vie rêvée des ...</td>\n",
       "      <td>As Good As It Gets (1997)</td>\n",
       "      <td>-1.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>51620</th>\n",
       "      <td>838</td>\n",
       "      <td>728</td>\n",
       "      <td>1</td>\n",
       "      <td>997454464</td>\n",
       "      <td>[0, 575, 1633, 742, 17, 1894, 1050, 848, 236, ...</td>\n",
       "      <td>[, Dreamlife of Angels, The (La Vie rêvée des ...</td>\n",
       "      <td>Pi (1998)</td>\n",
       "      <td>-1.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>51621</th>\n",
       "      <td>838</td>\n",
       "      <td>1362</td>\n",
       "      <td>0</td>\n",
       "      <td>997454486</td>\n",
       "      <td>[0, 575, 1633, 742, 17, 1894, 1050, 848, 236, ...</td>\n",
       "      <td>[, Dreamlife of Angels, The (La Vie rêvée des ...</td>\n",
       "      <td>Crimson Tide (1995)</td>\n",
       "      <td>-1.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>51622</th>\n",
       "      <td>838</td>\n",
       "      <td>41</td>\n",
       "      <td>1</td>\n",
       "      <td>998315055</td>\n",
       "      <td>[0, 575, 1633, 742, 17, 1894, 1050, 848, 236, ...</td>\n",
       "      <td>[, Dreamlife of Angels, The (La Vie rêvée des ...</td>\n",
       "      <td>Godfather: Part II, The (1974)</td>\n",
       "      <td>-1.0</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "       uid   iid  label  timestamp  \\\n",
       "51618  838  1619      1  997454429   \n",
       "51619  838   407      0  997454464   \n",
       "51620  838   728      1  997454464   \n",
       "51621  838  1362      0  997454486   \n",
       "51622  838    41      1  998315055   \n",
       "\n",
       "                                                     his  \\\n",
       "51618  [0, 575, 1633, 742, 17, 1894, 1050, 848, 236, ...   \n",
       "51619  [0, 575, 1633, 742, 17, 1894, 1050, 848, 236, ...   \n",
       "51620  [0, 575, 1633, 742, 17, 1894, 1050, 848, 236, ...   \n",
       "51621  [0, 575, 1633, 742, 17, 1894, 1050, 848, 236, ...   \n",
       "51622  [0, 575, 1633, 742, 17, 1894, 1050, 848, 236, ...   \n",
       "\n",
       "                                               his_title  \\\n",
       "51618  [, Dreamlife of Angels, The (La Vie rêvée des ...   \n",
       "51619  [, Dreamlife of Angels, The (La Vie rêvée des ...   \n",
       "51620  [, Dreamlife of Angels, The (La Vie rêvée des ...   \n",
       "51621  [, Dreamlife of Angels, The (La Vie rêvée des ...   \n",
       "51622  [, Dreamlife of Angels, The (La Vie rêvée des ...   \n",
       "\n",
       "                                title  flag  \n",
       "51618                Body Heat (1981)  -1.0  \n",
       "51619       As Good As It Gets (1997)  -1.0  \n",
       "51620                       Pi (1998)  -1.0  \n",
       "51621             Crimson Tide (1995)  -1.0  \n",
       "51622  Godfather: Part II, The (1974)  -1.0  "
      ]
     },
     "execution_count": 40,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "data.tail(5)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 41,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "((33891, 8), (10401, 8), (7331, 8))"
      ]
     },
     "execution_count": 41,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "train_ = data[data['flag'].isin([-1])].copy()\n",
    "valid_ = data[data['flag'].isin([0])].copy()\n",
    "test_ = data[data['flag'].isin([1])].copy()\n",
    "train_.shape,valid_.shape,test_.shape"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 42,
   "metadata": {},
   "outputs": [],
   "source": [
    "train_user = train_['uid'].unique()\n",
    "train_item = train_['iid'].unique()\n",
    "valid_['not_cold'] = valid_[['uid','iid']].apply(lambda x: x.uid in train_user and x.iid in train_item, axis=1).astype(\"int\")\n",
    "test_['not_cold'] = test_[['uid','iid']].apply(lambda x: x.uid in train_user and x.iid in train_item, axis=1).astype(\"int\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 43,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>uid</th>\n",
       "      <th>iid</th>\n",
       "      <th>label</th>\n",
       "      <th>timestamp</th>\n",
       "      <th>his</th>\n",
       "      <th>his_title</th>\n",
       "      <th>title</th>\n",
       "      <th>flag</th>\n",
       "      <th>not_cold</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>1</td>\n",
       "      <td>1</td>\n",
       "      <td>1</td>\n",
       "      <td>994556598</td>\n",
       "      <td>[0]</td>\n",
       "      <td>[]</td>\n",
       "      <td>Shawshank Redemption, The (1994)</td>\n",
       "      <td>-1.0</td>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>1</td>\n",
       "      <td>2</td>\n",
       "      <td>1</td>\n",
       "      <td>994556636</td>\n",
       "      <td>[0, 1]</td>\n",
       "      <td>[, Shawshank Redemption, The (1994)]</td>\n",
       "      <td>Sting, The (1973)</td>\n",
       "      <td>-1.0</td>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "   uid  iid  label  timestamp     his                             his_title  \\\n",
       "0    1    1      1  994556598     [0]                                    []   \n",
       "1    1    2      1  994556636  [0, 1]  [, Shawshank Redemption, The (1994)]   \n",
       "\n",
       "                              title  flag  not_cold  \n",
       "0  Shawshank Redemption, The (1994)  -1.0         1  \n",
       "1                 Sting, The (1973)  -1.0         1  "
      ]
     },
     "execution_count": 43,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "train_['not_cold'] = pd.DataFrame(np.ones(train_.shape[0]),index=train_.index).astype(\"int\")\n",
    "train_.head(2)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 44,
   "metadata": {},
   "outputs": [],
   "source": [
    "save_path = \"/data/zyang/datasets/ml-1m/\"\n",
    "train_.to_pickle(save_path+\"train_ood2.pkl\")\n",
    "valid_.to_pickle(save_path+\"valid_ood2.pkl\")\n",
    "test_.to_pickle(save_path+\"test_ood2.pkl\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 45,
   "metadata": {},
   "outputs": [],
   "source": [
    "valid_small = valid_.sample(frac=0.5,random_state=2023)\n",
    "valid_small.to_pickle(save_path+\"valid_small_ood2.pkl\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 46,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(5200, 9)"
      ]
     },
     "execution_count": 46,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "valid_small.shape"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 47,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "count    33891.000000\n",
       "mean        38.683456\n",
       "std         42.592378\n",
       "min          1.000000\n",
       "25%          9.000000\n",
       "50%         23.000000\n",
       "75%         54.000000\n",
       "max        339.000000\n",
       "Name: his, dtype: float64"
      ]
     },
     "execution_count": 47,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "train_['his'].apply(len).describe()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 48,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(0.5367501696615621, 0.5453553403355613, 0.5283145851360446)"
      ]
     },
     "execution_count": 48,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "train_.label.mean(), test_.label.mean(), valid_.label.mean()  "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 49,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead tr th {\n",
       "        text-align: left;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr>\n",
       "      <th></th>\n",
       "      <th colspan=\"2\" halign=\"left\">label</th>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th></th>\n",
       "      <th>count</th>\n",
       "      <th>sum</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>count</th>\n",
       "      <td>320.000000</td>\n",
       "      <td>320.000000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>mean</th>\n",
       "      <td>22.909375</td>\n",
       "      <td>12.493750</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>std</th>\n",
       "      <td>47.763208</td>\n",
       "      <td>25.020492</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>min</th>\n",
       "      <td>1.000000</td>\n",
       "      <td>0.000000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>25%</th>\n",
       "      <td>3.000000</td>\n",
       "      <td>1.000000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>50%</th>\n",
       "      <td>8.000000</td>\n",
       "      <td>4.000000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>75%</th>\n",
       "      <td>23.000000</td>\n",
       "      <td>13.000000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>max</th>\n",
       "      <td>573.000000</td>\n",
       "      <td>251.000000</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "            label            \n",
       "            count         sum\n",
       "count  320.000000  320.000000\n",
       "mean    22.909375   12.493750\n",
       "std     47.763208   25.020492\n",
       "min      1.000000    0.000000\n",
       "25%      3.000000    1.000000\n",
       "50%      8.000000    4.000000\n",
       "75%     23.000000   13.000000\n",
       "max    573.000000  251.000000"
      ]
     },
     "execution_count": 49,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "test_.groupby(\"uid\").agg({\"label\":['count','sum']}).describe()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 50,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead tr th {\n",
       "        text-align: left;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr>\n",
       "      <th></th>\n",
       "      <th colspan=\"2\" halign=\"left\">label</th>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th></th>\n",
       "      <th>count</th>\n",
       "      <th>sum</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>count</th>\n",
       "      <td>3087.000000</td>\n",
       "      <td>3087.000000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>mean</th>\n",
       "      <td>10.978620</td>\n",
       "      <td>5.892776</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>std</th>\n",
       "      <td>12.641559</td>\n",
       "      <td>8.879212</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>min</th>\n",
       "      <td>1.000000</td>\n",
       "      <td>0.000000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>25%</th>\n",
       "      <td>2.000000</td>\n",
       "      <td>1.000000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>50%</th>\n",
       "      <td>6.000000</td>\n",
       "      <td>2.000000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>75%</th>\n",
       "      <td>15.000000</td>\n",
       "      <td>7.000000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>max</th>\n",
       "      <td>154.000000</td>\n",
       "      <td>103.000000</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "             label             \n",
       "             count          sum\n",
       "count  3087.000000  3087.000000\n",
       "mean     10.978620     5.892776\n",
       "std      12.641559     8.879212\n",
       "min       1.000000     0.000000\n",
       "25%       2.000000     1.000000\n",
       "50%       6.000000     2.000000\n",
       "75%      15.000000     7.000000\n",
       "max     154.000000   103.000000"
      ]
     },
     "execution_count": 50,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "train_.groupby(\"iid\").agg({\"label\":['count','sum']}).describe()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 51,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(293,)"
      ]
     },
     "execution_count": 51,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "valid_[valid_['uid'].isin(train_['uid'].unique())].uid.unique().shape"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 52,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([   1,    2,    3, ..., 1282, 3254, 3255])"
      ]
     },
     "execution_count": 52,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "train_['iid'].unique()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 53,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(2394,)"
      ]
     },
     "execution_count": 53,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "valid_[valid_['iid'].isin(train_['iid'].unique())].iid.unique().shape"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 54,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "((2506,), (2203,))"
      ]
     },
     "execution_count": 54,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "valid_.iid.unique().shape, test_.iid.unique().shape"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 55,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "((356,), (320,))"
      ]
     },
     "execution_count": 55,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "valid_.uid.unique().shape, test_.uid.unique().shape"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 56,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "((740,), (3087,))"
      ]
     },
     "execution_count": 56,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "train_.uid.unique().shape, train_.iid.unique().shape"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 57,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "<Axes: xlabel='uid'>"
      ]
     },
     "execution_count": 57,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "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vCC73a7Ro0erqKhIgwcP1ssvv2w+3+Fw6JNPPtGDDz6olJQUBQYGaty4cZoxY0btbhUAAGiQqhVcXn311QvO9/Pz05w5czRnzpzzLtO0aVN9+umn1VktAACAJH6rCAAAWAjBBQAAWAbBBQAAWAbBBQAAWAbBBQAAWAbBBQAAWAbBBQAAWAbBBQAAWAbBBQAAXLbE3y6+IushuAAAAMsguAAAAMsguAAAAMsguAAAAMsguAAAAMsguAAAAMsguAAAAMsguAAAAMsguAAAgBq7UgPP+RBcAACAZRBcAACAZRBcAACAZRBcAACAZRBcAACAZRBcAACAZRBcAACAZRBcAACAZRBcAACAZRBcAACAZRBcAACAZRBcAACAZRBcAABAtV3pH1f0IbgAAADLILgAAADLILgAAADLILgAAADLILgAAADLILgAAADLILgAAADLILgAAADLILgAAADLILgAAADLILgAAADLILgAAADLILgAAADLILgAAADLILgAAIBLlvjbxfW6foILAACwDIILAACwDIILAACwDIILAACwDIILAACwDIILAACwDIILAACwDIILAAC4qPoev8WH4AIAAC7oagktEsEFAABYCMEFAABYBsEFAABYBsEFAABYBsEFAABU6WpqlOtDcAEAAJZBcAEAAJZBcAEAAJZRreAyc+ZM9ejRQ8HBwYqOjtbIkSO1Y8eOCssUFhZq0qRJioiIUFBQkEaPHq3MzMwKy6Snp2vYsGEKCAhQdHS0pk2bptLS0svfGgAA0KBVK7isWLFCkyZN0po1a7Rs2TKVlJRo0KBBys/PN5f51a9+pUWLFum9997TihUrdPjwYY0aNcqcX1ZWpmHDhqm4uFirVq3SggULNH/+fD3xxBO1t1UAAKBBclZn4SVLllT4e/78+YqOjlZqaqpuvPFG5eTk6NVXX9Vbb72l/v37S5Jef/11tWnTRmvWrFHv3r21dOlSbd26VV988YViYmLUuXNnPf300/rNb36jp556Sm63u/a2DgAANCiX1cYlJydHkhQeHi5JSk1NVUlJiQYMGGAuk5ycrISEBK1evVqStHr1anXo0EExMTHmMoMHD1Zubq5+/PHHKtdTVFSk3NzcChMAALj21Di4lJeX65FHHlGfPn3Uvn17SVJGRobcbrdCQ0MrLBsTE6OMjAxzmbNDi2++b15VZs6cqZCQEHOKj4+vabEBAICF1Ti4TJo0SVu2bNHbb79dm+Wp0vTp05WTk2NOBw8erPN1AgBwrboaB57zqVYbF5/Jkyfrk08+0TfffKO4uDjz8djYWBUXF+vkyZMVal0yMzMVGxtrLrN27doKr+frdeRbpjKPxyOPx1OTogIAgAakWjUuhmFo8uTJ+uCDD/Tll18qKSmpwvxu3brJ5XJp+fLl5mM7duxQenq6UlJSJEkpKSnavHmzsrKyzGWWLVsmr9ertm3bXs62AACABq5aNS6TJk3SW2+9pY8++kjBwcFmm5SQkBD5+/srJCRE9957r6ZOnarw8HB5vV499NBDSklJUe/evSVJgwYNUtu2bXX33XfrueeeU0ZGhh5//HFNmjSJWhUAAHBB1Qouc+fOlST169evwuOvv/66xo8fL0l64YUXZLfbNXr0aBUVFWnw4MF6+eWXzWUdDoc++eQTPfjgg0pJSVFgYKDGjRunGTNmXN6WAACABq9awcUwjIsu4+fnpzlz5mjOnDnnXaZp06b69NNPq7NqAAAAfqsIAABYB8EFAABIurq7QfsQXAAAgGUQXAAAgGUQXAAAgGUQXAAAgGUQXAAAgGUQXAAAgGUQXAAAgGUQXAAAgGUQXAAAgGUQXAAAuMZZYcRcH4ILAACwDIILAACwDIILAACwDIILAACwDIILAACwDIILAADXKCv1JvIhuAAAAMsguAAAAMsguAAAAMsguAAAcI2xYtsWH4ILAACwDIILAACwDIILAACwDIILAADXCCu3bfEhuAAAAMsguAAA0MA1hJoWH4ILAACwDIILAACwDIILAACwDIILAAANVENq2+JDcAEAAJZBcAEAoIFpiDUtPgQXAABgGQQXAABgGQQXAABgGQQXAAAaiIbctsWH4AIAACyD4AIAACyD4AIAACyD4AIAACyD4AIAgMVdC41yfQguAADAMgguAABY1LVU0+JDcAEAAJZBcAEAAJZBcAEAAJZBcAEAwGKuxbYtPgQXAABgGQQXAABgGQQXAAAs4lq+ReRDcAEAAJZBcAEAAJZBcAEA4CrHLaL/Q3ABAACWQXABAACWQXABAOAq47s1xC2icxFcAACAZRBcAAC4SlDDcnEEFwAA6hmB5dIRXAAAgGUQXAAAgGVUO7h88803GjFihBo3biybzaYPP/ywwnzDMPTEE0+oUaNG8vf314ABA7Rr164Kyxw/flx33XWXvF6vQkNDde+99yovL++yNgQAADR81Q4u+fn56tSpk+bMmVPl/Oeee06zZ8/WvHnz9P333yswMFCDBw9WYWGhucxdd92lH3/8UcuWLdMnn3yib775Rg888EDNtwIAAAuibUv1Oav7hCFDhmjIkCFVzjMMQ7NmzdLjjz+uW2+9VZL097//XTExMfrwww91xx13aNu2bVqyZInWrVun7t27S5JefPFFDR06VM8//7waN258GZsDAAAaslpt47Jv3z5lZGRowIAB5mMhISHq1auXVq9eLUlavXq1QkNDzdAiSQMGDJDdbtf3339f5esWFRUpNze3wgQAgFVR01JztRpcMjIyJEkxMTEVHo+JiTHnZWRkKDo6usJ8p9Op8PBwc5nKZs6cqZCQEHOKj4+vzWIDAACLsESvounTpysnJ8ecDh48WN9FAgCg2qhpuXy1GlxiY2MlSZmZmRUez8zMNOfFxsYqKyurwvzS0lIdP37cXKYyj8cjr9dbYQIAANeeWg0uSUlJio2N1fLly83HcnNz9f333yslJUWSlJKSopMnTyo1NdVc5ssvv1R5ebl69epVm8UBAOCqQE1L7al2cMnLy1NaWprS0tIknWmQm5aWpvT0dNlsNj3yyCP6f//v/+njjz/W5s2bNXbsWDVu3FgjR46UJLVp00Y333yz7r//fq1du1YrV67U5MmTdccdd9CjCADQIPDrznWn2t2h169fr5tuusn8e+rUqZKkcePGaf78+XrssceUn5+vBx54QCdPntT111+vJUuWyM/Pz3zOwoULNXnyZP3sZz+T3W7X6NGjNXv27FrYHAAA0JBVO7j069dPhmGcd77NZtOMGTM0Y8aM8y4THh6ut956q7qrBgAA1zhL9CoCAACQCC4AAMBCCC4AANQSGuPWPYILAACXicBy5RBcAACoIQLLlUdwAQCgmggs9YfgAgAALIPgAgDAJaCW5epAcAEAAJZBcAEAoAr83tDVieACAAAsg+ACAAAsg+ACAIC4NWQVBBcAAGAZBBcAwDWNGhZrIbgAAK5JBBZrIrgAAADLILgAAK4JNL5tGAguAIAGjaDSsBBcAAANEoGlYSK4AAAaBG4FXRsILgAASyOoXFsILgAASyKwXJsILgCAq1rlW0AElmsbwQUAcFUioKAqBBcAwFWBGhVcCoILAKBeEVRQHQQXAMAVRc0KLgfBBQAAWAbBBQBQp6hhQW0iuAAA6gRBBXWB4AIAACyD4AIAqBXcEsKVQHABAFRb4m8XE1RQLwguAICLIqTgakFwAQCcg6CCqxXBBQBgIqjgakdwAYBrEL+4DKsiuADANYCAgoaC4AIADRBBBQ0VwQUALIxbPrjWEFwAwEIIKLjWEVwA4CpGUAEqIrgAQD06360eggpQNYILAFxBBBPg8hBcAKAOEVSA2kVwAYBqqiqMcKsHuDIILgBQCe1OgKsXwQXANY9gAlgHwQVAg3WxmhOCCmA9BBcAlkcgAa4dBBcAlkFAAUBwAVBvLvVWDgEFgA/BBcAVQxABcLkILgAuy9lhhBoTAHWN4ALggggjAK4mBBfgGkcwAWAlBBfAYqrboJVgAqAhIbgAVymCBgCci+ACXGHUhABAzRFcgLPU5u0XAgkA1D6CCxo02nsAQMNCcIElEUQA4NpUr8Flzpw5SkxMlJ+fn3r16qW1a9fWZ3FwHpdz26S2e8AQSADg2lZvweWdd97R1KlT9eSTT2rDhg3q1KmTBg8erKysrPoqUoNBSAAANFT1Flz+/Oc/6/7779c999yjtm3bat68eQoICNBrr71WX0WqdwQNAAAurF6CS3FxsVJTUzVgwID/K4jdrgEDBmj16tXnLF9UVKTc3FxzysnJkSTl5uYq4VfvWeLfS1mmvOh0g/v3aihDffx7NZSB95v3m/eb9/tqfL8lyTCMmocIox4cOnTIkGSsWrWqwuPTpk0zevbsec7yTz75pCGJiYmJiYmJqQFMe/bsqXGGsESvounTpysnJ8ecDhw4UN9FAgAANRQeHl7j5zprsRyXLDIyUg6HQ5mZmRUez8zMVGxs7DnLezweeTyeK1U8AABQh+z2mteb1EuNi9vtVrdu3bR8+XLzsfLyci1fvlwpKSn1USQAAGAB9VLjIklTp07VuHHj1L17d/Xs2VOzZs1Sfn6+7rnnnvoqEgAAuMrVW3C5/fbblZ2drSeeeEIZGRnq3LmzlixZopiYmIs+1+Px6Pe//70KCwu1Zs0a9ejRQ+vWrbvovykpKTIMo1rPsfq/1+I2X8vbfi1u87W87dfiNl/L294QtjklJeWym3/YDONy+iQBAABcOZboVQQAACARXAAAgIUQXAAAgGUQXAAAgGUQXAAAlkBfEkj12B0aQNWOHDmiuXPn6rvvvtORI0dkt9vVrFkzjRw5UuPHj5fD4ajvIgL1wuPxaOPGjWrTpk19FwX1yJLdofPz8/X111/ro48+Unp6usrKytS/f3/5+/urrKxMpaWlMgxDw4YNU4cOHbR69Wp9/fXXWrlypTp06KDDhw/r1KlT+utf/6rIyEgVFBRo2bJlKi0tVWBgoP70pz+poKBAt9xyi4KDgxUcHKybbrpJaWlpWrhwobKystSsWTMNGTJE/fv315tvvqm1a9fK399f1113nUJDQ3Xs2DFt3rxZ+/fvl81m00033aSxY8fq6NGjeu2115SWlqaffvpJH374oZKSkjRixAi99NJLatq0qSRpz5492rVrlzwej4qKitS9e3ft2bNHX331lVauXKnc3Fw5HA4lJycrNDRUO3bs0N69exUUFKShQ4dq+/btuvfee5WSkqKtW7fq/fff1/jx45WYmKht27bpL3/5i3bu3CmPxyObzabCwkIlJCRo6dKleu2115SZmSmHw6GhQ4cqMjLS3Pepqalq3ry5unfvrg4dOuimm27SE088oblz5+rvf/+7AgIC5HK51K1bNzVr1kyJiYmaN2+e9u/fr8DAQLVr104ul0vZ2dk6ePCgysvLVV5eroCAAEVERKhp06aKiYlRZmamIiIilJqaqn79+qmgoEDffvut7Ha7/P39FRkZqQMHDsjj8SgpKUkOh0P+/v6Kj49XWlqaNm3apF27diknJ0cnT55Unz591LhxYx06dEhNmjRReHi4li5dquzsbB05ckRt2rRR37595Xa7ZbfbNXr0aPXp00cffPCBXnrpJWVlZUmS/Pz8FB4erv79+ystLU1btmxRUVGRWrZsqRYtWsjlcmn9+vUqKChQSkqKbrrpJn344Yd65plnFBYWptTUVHm9XhmGoYyMDElSXl6edu7cqTVr1igkJET/+Mc/5O/vb87zer2y2+3mevr166cdO3YoMTFRkrRkyRIdPnxYoaGhcrlceuyxx9SsWTPFx8fr+eefV5MmTTR8+HD16tVLx48f14IFC/T++++rTZs2atKkiZKSkjRgwADNnz9fMTExKi8v16RJk8z3vLS0VAsXLtSOHTuUnp6u+Ph4ORwOud1uTZkyRSEhIVWepyUlJdq/f7+eeuop/elPfzKPSZvNJq/Xq0GDBmnYsGHy8/NTZmamhgwZIpfLpfz8fKWmpqpdu3b67//+b6Wnp6t79+6688479fjjj+vkyZMKDAzUjTfeqDFjxsjlcun48eNq1aqVgoKCVFxcrICAAAUEBKh9+/Zq3ry5jh49qrffflsRERG67bbblJqaqtzcXNlsNg0bNkxTp06V1+tVeXm5fvrpJ4WEhGjp0qUqLy/XP//5T/Xu3VtZWVmy2Wy6/vrrZRiG0tLS9OWXX6q0tFTx8fF66KGHlJKSoqysLL355pv65ptvFBAQoOTkZEnSli1blJqaKpfLpZEjR6pnz57avn27hg0bpuTkZP3lL3/RP/7xDxUVFSkpKUlNmjRRu3bttHfvXrVs2VJRUVEaNGiQ3G63XnvtNb355ps6ceKEoqOj1aZNGw0aNEj9+vVTaGio7Ha7HA6H9uzZo9dee00bNmxQVFSUDMPQAw88oP/5n/9RRESEunTpoi+++EIZGRlyuVzy9/fXvHnzZBiGIiMjtWbNGq1Zs0Zut1sJCQnq27evPv74Y23dulWhoaF699135efnp6KiIp06dUq33HKLRo4cKZfLpa+++krffvutnE6nvF6vunTpooSEBLVv316rV69W165d9Y9//EPp6elq2rSpsrOz9Ytf/EI/+9nPNHHiRB09elRRUVEqKiqSw+HQ+vXrlZaWphYtWig2NlZJSUlKTEzUO++8o5///OeaNm2atm3bpkceeURZWVlyuVxq2rSpWrdurdLSUgUFBSk0NFShoaFyOp1q3ry5WrVqpbvuuktZWVkqLi5WeHi4WrVqZS7XpEkTrVq1SitXrlRycrKOHDmi06dPS5JatGihiIgIFRYWKiUlRRkZGdqwYYN69uypli1basaMGeratavi4uLUs2dPHTt2TBkZGTp69KiKi4t17NgxhYSEqEePHmrVqpWWLVumjz76yPzMiYyM1GOPPaaePXtq586d+tvf/qaDBw9qzJgxCg8P13333adDhw7JZrMpNjZW1113naKjozVmzBiFhoZq3bp1+vWvf60hQ4bozjvv1Msvv6xZs2apcePGGj58uHr27KlTp07pyJEjat++vZxOp1JTU+Xn56e8vDw1b95c69evV35+vpo2bSqn06mEhASNGzdOwcHB+vjjj/Xoo4+qa9euuv766+Xn56eysjKdPn1aGzduVIsWLXTdddfJMAy9//77ys/P16233qp/+7d/q/Knfaqlxj/PeAVlZ2cbQ4cONf7whz8YEydONBwOx0V/edLlchmSDLvdbkgynE6nIcmw2WzV+gXL6i5/oclXhsqvHxERUaHcbrf7nOV821HdqabPO7t8Ho/HiIuLM2JiYq7or4eeb9/73tu6nqKjo2vttdq3b39F99359qfL5TL8/f0rPH728ebb5y6Xy4iNjTX69+9/zjHk9Xor/J2UlGR07tzZiI2NNfr06WP07t3biIqKqlEZ/fz8qnXOORwO44YbbqiV/RMbG2skJSXVaL/6/h8YGHjR8p99vvumyz1Pz54CAgIMSYbH47ms16l8nNTF5HA4jHbt2lXY75WPr/qcqrpmW3kKCAgwPz8v5Vitq6lbt27GokWLjNLS0hplAkvUuDgcDpWXl0uSbDabXC6XiouL67lUAACgumw2mySpbdu2+vzzz9WkSZNqPd8SjXN9oUWSDMMgtKBeOJ00CQNwxuUMWX+tMwxDhmHoxx9/1COPPFLt51siuEj/96HhS2poWAICAuq7CBdVWlp62a8RHh5eCyXBperatWt9FwENVFFRUX0XwTLs9nOjht1u12uvvaavv/66+q9XC2W6In73u9+d89iFvgHT8+LqVvlALikpqaeSXFknTpyo7yLUuqv5XNuwYUN9FwFXWF19uaWGpWZsNluFph4+CQkJSk5OrnBH5VJZJrj4WqGf3STnQt+Ay8rKqr2Oqg54anjqRuWD1YrBpSbHhgWalFVbTc61hobrxNWjrs4xalhq5uz3w/d/h8Oh2bNna8KECRo1alS1X9MSwcVms2n37t364YcfFB8fr/79+1dZ9XS5qjrg6/ODxuv1Vvj7sruQ1ZK62PfSuRf/0NBQNWvWTG63+6LPjYqKOu88u92uoKAgBQUFnXNLyrctNpvtom1YKi9z9rHhcrkuWsaL8fPzu+D8s9ftdDprpc1NYGBglY9fyQ/i2j6efA347XZ7rW6H3W4/77FYl9eJ0NDQy3q+bx/YbDazm/359ovH47nosVz5uKv8/l2pY+dS13O+4+tiz7fZbNWuZXG73WrVqpVat26tnj17SjqzT337vTZULlPbtm01efJkTZ48WX5+foqIiJDdbq+z67SP0+lUt27dNG7cuGo/t6ysTCNHjlTz5s31wgsvVPv5luhVtGDBAt1xxx3Ky8tTRESEJKm4uFi33XabVq1apZ49e8rpdMowDDVv3lwJCQn6/PPPtXPnTnXt2lWnTp3S9u3bdeLECbVr107h4eGy2Wzatm2bioqKFBwcrPHjxyszM1ODBg2S1+vVa6+9poyMDCUnJ6tTp05q3ry55s6dqx49eujzzz/XgQMHVFZWpqZNm6qoqEg7d+7U7NmzFRkZqQ8++EDp6elKT09XUFCQioqKVF5erp///OdauHCh0tPTlZubq/bt26tLly7KzMzUo48+qoyMDL3xxhsqLy9XRESE3nnnHc2aNUtBQUGaOHGi/vznP6t169YqKirSH/7wB+Xn5+vNN980q+IaNWqkf/zjH3rnnXeUn58vt9ut4OBgdejQQeHh4YqOjlZqaqr27dunTp06KT09XUeOHFF2dra5b6Ojo+V0OpWcnKyuXbuquLhYp0+f1rx581RUVKSoqCj17t1b69ev19y5c7Vjxw7dd999evbZZ7V8+XIVFhaqvLxcQUFBysnJUUBAgFq0aKGwsDD17NlTw4YN04YNG7R37159+umn2r17t8aNG6fU1FStXbtWeXl5atSokbp3767nn39edrtdZWVl2rBhg5YuXaqSkhJFRUXp0KFDGjp0qB599FHl5eWpV69e+vrrr3XdddeppKREHTp00F//+lfl5ubqm2++UcuWLTVnzhx98cUXysrK0u7du1VYWKji4mLdcsst5tgc/fr1U2pqqhYsWKATJ06ocePGuvXWWxUUFKQWLVqoW7duevLJJ7V+/XoFBwdr06ZNKigokMPhUHR0tJo0aSK3261OnTopPz9fp06d0q5du3To0CHl5OTIMAyVl5erd+/eioqKUmlpqa677jrdfvvtCgkJqTCWx+HDh1VaWqrg4GB17NhRffr00aFDh5SWlqYRI0Zo1KhRWrNmje644w55PB5lZ2dr79695rGQmJioY8eO6YMPPtAHH3ygXr16KTExUT/88IPeffddZWdnKykpSYWFhTpx4oQMw1B8fLwmTZokt9ut3NxcxcXF6dtvv9Xy5cvVokULFRcXq3379kpJSVFmZqbeeOMNhYSEaN++fSopKTHfd4/Ho/DwcCUkJGjq1KlasWKFwsPDdfjwYaWnpys8PFyzZs3SJ598ovj4eBUXF2vhwoXau3evCgoKtGXLFpWXl+uVV15RcHCw+vbtq+XLl2vWrFnat2+fpDNj3GRnZ8vr9erGG2/UhAkT1KNHDwUHB5vXjo0bN+qNN97Qtm3blJSUpMjISB0/flxOp1M7d+5USEiIgoKCVFZWpoSEBO3bt08Oh0MlJSVatWqVCgoKVF5erpKSEiUnJ6t3797Kzs7WggULKvSE8H1g/fznP9fBgwf13Xffadq0aVq7dq0WLlyomJgYORwOnTx5Uh07dtThw4fNMXqKi4uVkZGhvLw8HTx4UI8//rjGjh2rVatWaeDAgWrcuLHmzp2r77//Xq1bt5YkJSYmymaz6cCBAyosLNS+ffsUFxen8vJy+fv7Ky0tTcePH1fjxo3VtWtXnT59Wt99951CQ0N13333aeDAgWbZ8/PztXXrVh08eFAbN27UoUOH9MMPP2jv3r0KDAzU9OnTFR4ergMHDujTTz+V3W7X7t27dfToUblcLt1www0aPXq0UlJStHbtWi1btky5ubkqKChQRESEbrjhBm3cuFFer1cej0f//Oc/5e/vr969e2v27NnatWuXXn75ZTmdTj344IN6++239fOf/1z/9V//pe+++06PPvqoBg0apAceeEAbNmzQsGHDdM8996h9+/Z68skntXLlSuXn5yspKUmnT59WWFiYjhw5op9++kkdOnSQYRgKDAyU2+3Wvn37VFBQoIkTJ2rq1Kl64IEH9MMPP6h79+4KCQlRQECAdu/erezsbE2dOlWtWrVSamqqysvL9cYbb6i0tNTcz3l5eTp27JgaN26sFi1aKDs7W4899liF48L32fX5559r+fLlGjp0qE6ePGmeo4ZhyOFwyOPxVDhv9+zZo507dyo+Pl6tWrXSjBkztHjxYrndbnXu3Fm5ubnKy8vTtGnTdOONN5rry8zM1LRp07R582b961//UlBQkNavX69nnnlGTZs21ebNm3Xy5Endc889iouLU1xcnIYPH66BAwfKbrcrKipKt912m9avX68dO3Zo3rx5+uyzz/S3v/1NUVFR2rlzp3bt2qWSkhLFx8erffv2GjlypG666SYVFhbqX//6lzZu3KjOnTurqKhI2dnZCgoKUufOnfX999/r/fffV3FxsR544AGNHz9eLVu2rFEmsERwOdvBgweVk5OjrVu3avjw4dq6dav+53/+R4sXL1ZKSopOnjypgwcPKiMjQ7m5ufL391d0dLR69uypFStW6OTJk3I6nYqJiVF8fLxiY2PVpEkTuVwuOZ1OpaWlaffu3QoPD1fjxo311FNP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+w290rUSFyrf+b5hXs0BxAoj3FblSl1k6lJtdLm+EGrsakflYQxqW11+iNXGMXAp5auN9VzKMAkNgfG/w+PXhks9durqGNuzZ49uu+028707dOiQkpKSqv06lrhShYWFyTAM2Ww27du3T48//rgkaejQoRcdtbPyN+0rHQqMSmN9XGysjqud7yfdL6Z///51XJIzLnV8hMLCwsteV32OEHv2txRcmtoex+VS5ebmnvNYbZajLm+pne/6WNv7sbauw4TtMy71S82Fjp2z3+Oqluvbt2/1C1aJx+PR8uXLVVxcrCZNmigsLEx33nln9V/ospr2XiETJkwwEhMTDa/Xa9hstgq9csLCwozw8HDD39/f6Natm3HrrbeetwV75d48lX/23d/f3/D39zdcLtcltYx2u92X3aLd7Xaft2eEzWYzEhMTjWbNmtVaa25f74namKKios77em6320hJSTEGDBhgtG7d2rj99tsv6TV971FVvZKCg4PrpHdCdXqnORwOIyoq6qK9Txo3bmwMHTrUmDJlivHwww+fc0ydb7+5XC6jUaNGFzyuvF6vMXHiRLOXXVJSkiHJ6Nixo9nTx3dcXW7vLt929u3b1/D3969xT77a7Pnh5+dneDweIzg42HC5XGaZAgMDjV/+8pfG2LFjzzm3fe9zbfXo862zUaNGtdpjKC4uzhg9erQxYMCA8y4TEhJijBgxwggICDAf83g85rb5yub72+PxGGFhYdXarrOfX9XUuHHjc95T33MrHyM12edut9tITk6u8vV8k7+/v/Gf//mfl3xNa9SokREUFHTR7T673AkJCca0adOMLl261Gov1uocZ5WPr6ioqAp/h4eHG2PHjjVatmxpSDKaNm1qznM6ncaGDRsMSUa/fv2Mm2++2Zg8ebIxatSoS9qemmyzzWa74PXR6/Uar7/+uvH0008bffv2rVEmsESvorPt27dPGRkZKi0tVUhIiDp27CibzSaHw6Evv/xSAwYMkGEYWrVqlXJzcxUQEGB+A7rhhhv0z3/+U9nZ2eY4Ie+++67+9a9/aeLEiRozZoy5ngMHDmjhwoU6ePCgmjRpolatWpmDGjVv3lyTJ0/WDz/8oLi4OH3xxRf65S9/qW+//Vb79+/XmDFj9OijjyoyMlKS9Nhjj2nMmDGKi4tTQUGBQkND1bZtWzVr1kyxsbEKDAzUm2++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",
      "text/plain": [
       "<Figure size 640x480 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "m = train_.groupby('uid').agg({'label':'count'}).sort_values('label').reset_index()\n",
    "m.plot(x='uid',kind='bar')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 58,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "838"
      ]
     },
     "execution_count": 58,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "train_.uid.max()\n",
    "\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 59,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "<Axes: xlabel='uid'>"
      ]
     },
     "execution_count": 59,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "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",
      "text/plain": [
       "<Figure size 640x480 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "n = valid_.groupby('uid').agg({'label':'count'})\n",
    "idx = []\n",
    "a = valid_.uid.unique()\n",
    "for x in m['uid'].values[:]:\n",
    "    if x in a:\n",
    "        idx.append(x)\n",
    "n.loc[idx].reset_index().plot(x='uid',kind='bar')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 65,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "<Axes: xlabel='uid'>"
      ]
     },
     "execution_count": 65,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "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m28wd+5c7N69G506ddLvFxYWok2bNjh16hQWLlyITz75BB9//DGef/75y7dXREREdEMyREQu9sP79u1DWFgY5s6diwYNGiA3NxehoaGYMGECbr/9dgDA+vXrUblyZSxatAh169bFzz//jNtuuw27d+9GeHg4AGDMmDEYNGgQ9u3bB4fDcc7vzcvLg7+/P3Jzc+Hn53exySciIqKroNzTP2Lb620uy/X7kvq45ObmAgCCgoIAAMuXL0dBQQGaNWum10lOTkZcXBwWLVoEAFi0aBGqVq2qgxYAyMrKQl5eHv78889Sv+fkyZPIy8tzWYiIiOjmc9GBS1FREQYMGIB69eohNTUVAJCdnQ2Hw4GAgACXdcPDw5Gdna3XMQct6n31XmmGDRsGf39/vcTGxl5ssomIiMjCLjpw6du3L9asWYP//ve/lzM9pRo8eDByc3P1smPHjiv+nURERHT9cb+YD/Xr1w9Tp07FvHnzEBMTo1+PiIjAqVOncPjwYZdWl7179yIiIkKvs3TpUpftqVFHap3inE4nnE7nxSSViIiIbiAX1OIiIujXrx8mTpyIWbNmISEhweX9WrVqwW63Y+bMmfq1v/76C9u3b0dGRgYAICMjA6tXr0ZOTo5eZ8aMGfDz80NKSsql7AsRERHd4C6oxaVv376YMGECJk2aBF9fX90nxd/fH56envD390evXr0wcOBABAUFwc/PD4888ggyMjJQt25dAECLFi2QkpKCnj174s0330R2djaGDBmCvn37slWFiIiIzuqCApcPPvgAANCoUSOX18ePH497770XAPDOO+/AZrOhc+fOOHnyJLKysvD+++/rdd3c3DB16lT06dMHGRkZ8Pb2xj333IOXXnrp0vaEiIiIbniXNI/LtcJ5XIiIiKzjupnHhYiIiOhqYuBCRERElsHAhYiIiCyDgQsRERFZBgMXIiIisgwGLkRERGQZDFyIiIjIMhi4EBERkWUwcCEiIiLLYOBCRERElsHAhYiIiCyDgQsRERFZBgMXIiIisgwGLkRERGQZDFyIiIjIMhi4EBERkWUwcCEiIiLLYOBCRERElsHAhYiIiCyDgQsRERFZBgMXIiIisgwGLkRERGQZDFyIiIjIMhi4EBERkWUwcCEiIiLLYOBCRERElsHAhYiIiCyDgQsRERFZBgMXIiIisgwGLkRERGQZDFyIiIgu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5XqdWbNmoaioCOnp6ZczOURERHSDueBRRUePHsWmTZv031u3bsWKFSsQFBSEuLg4DBgwAK+88goqVqyIhIQEPPfcc4iKikKHDh0AAJUrV0bLli3Ru3dvjBkzBgUFBejXrx+6devGEUVERER0VhccuCxbtgyNGzfWfw8cOBAAcM899+Djjz/GU089hWPHjuHBBx/E4cOHUb9+fUybNg0eHh76M1988QX69euHpk2bwmazoXPnzhg5cuRl2B0iIiK6kV1w4NKoUSOISJnvG4aBl156CS+99FKZ6wQFBWHChAkX+tVERER0k7PEqCIiIiIigIELERERWQgDFyIiIrIMBi5ERERkGQxciIiIyDIYuBAREZFlMHC5jvGH7oiIiFwxcCEiIiLLYOBCRERElsHAhYiIiCyDgQsRERFZBgMXIiIisgwGLkRERGQZDFyIiIjIMhi4EBERkWUwcCEiIiLLYOBCRERElsHAhYiIiCyDgQsRERFZBgMXIiIisgwGLkRERGQZDFyIiIjIMhi4EBERkWUwcCEiIiLLYOBCRERElsHAhYiIiCyDgQsREZEFlXv6x2udhGuCgQsRERFZBgMXIiIisgwGLkRERGQZDFyIiIhuYlbrK8PAhYiIiCyDgQsRERFZBgMXIiIisgwGLkRERGQZDFyIiIjIMhi4EBERkWUwcCEiIiLLYOBCRERElsHAhYiIiCyDgQsRERFZBgMXIiITq01/TnSzYeBCRERElsHAhYiIiCyDgQsRERFZBgMXIiIisgwGLkRERGQZDFyIiIjIMhi4EBERkWUwcCGyOM47QkQ3EwYuREREZBkMXIiIiMgyGLgQERGRZTBwISKiq459s+hiMXAhukHwQkBENwMGLkRERGQZDFyuAd4ZExERXRwGLkRERGQZDFyIiIjIMhi4EBERkWVc9sBl6NChMAzDZUlOTtbv5+fno2/fvggODoaPjw86d+6MvXv3Xu5kEBER0Q3oirS4VKlSBXv27NHLggUL9HuPPfYYpkyZgm+++QZz587F7t270alTpyuRDCIiIrrBuF+Rjbq7IyIiosTrubm5GDduHCZMmIAmTZoAAMaPH4/KlStj8eLFqFu37pVIDhEREd0grkiLy8aNGxEVFYXExETcdddd2L59OwBg+fLlKCgoQLNmzfS6ycnJiIuLw6JFi8rc3smTJ5GXl+eyEBER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GElKSnJ5326365Pdx8dHN4X6+vqKzWaTP//8UxISEvSjCNXqpwKl4mVF/V/dtZgrDRUUhoaGire3t67wlyxZIgEBAbqJuPixueOOO2To0KHy+++/i9PpFDc3N3nooYckOjpa4uLixGazSdOmTSUgIECCgoLO2lLidDolNDRUoqKiXPqDqEeioaGhOmg3p7dixYoud7QqIOjcubNOU7169eTxxx8Xb29vsdvt+g6xrMdnDodDKlSoIAEBASUCmuKLuiiochQeHi516tTRLWyllQPVv6b4hc682O12vS/mjvplre/j4yNPP/203H333fpcue2221zWiY2Nlfj4eHnggQekUqVKpbYklrWYWyzMr5kf6/Xv3/+sj/NUHaPKoCrzalt79+6VO++8U/bu3StDhgwRwLUlpX///rpPmbnVxGazSXh4uMTHx7usr84h1cFWBShxcXH6/61atdI3BubjX9p5a7fbJSUlRdzc3HRwo/JF9bEpa989PDzE6XRKQECAbtUICgrS52vNmjX1TZaHh4e89tpr+ibjXI95z9Z6bg5gzcfZHFwAOK8+fsXLQ8WKFWXr1q36eKr6WNWBCQkJ0qVLF8nLy5OaNWuKl5eXvmbWrVtX0tLSzlonGIYhWVlZupw1b95cMjMzyzwn1WtBQUElHhupNA0ePFgCAgKkRo0a0q5dO32jdqksE7hs2LBBP9MLCAgo8/maOYNVIYmIiJDt27frbY0YMUJiYmKkWbNmEhkZKbfffrt+9KSi8A4dOuj133rrLbnlllv06Inx48fLrbfeKlOmTNEFqn379mKz2XTP8uDgYH3CvPTSS/Loo49K//795a233pImTZrIvHnz9AUhKSlJX0DLuptRJ/6qVavknnvukXvvvVcHSMOHD5emTZtKp06d5NNPP5VOnTqVuY2OHTvK119/7XKXY15CQkIkIiJCd8qLjIyUoKAgqVWrlnz00Ueybt06GTp0aJl5fuutt8qRI0f0BX7hwoWycOFCCQ0NFafTKcHBwRIRESEhISFis9mkevXqkpGRUaJl5b333pPTp0/L0qVL5b777pPMzEyZPXu2zJ49W4KDg3WTsAqSQkJCJCoqSjw9PeXXX3+VXbt2yccffyy7d+8WwzCkQ4cOkpqaKs8995wUFBRIYWGhjB071uUZer169XSHuOLHoX79+hITE+Py+CMwMFD69OlTokXpXBdf83tq9IK6azeMM/2CUlJS9EVBlY3g4GB9UWjYsKHLRcXpdEqNGjVEROTbb78t8yIdHR2t+yoUv1uKj493+VvdwZlbHVTZr1u3rkREREjFihX1TYMKUOLi4qRcuXJiGIa88847MmLECKlWrZokJibqfXd3d3d5rFg8b0JDQ+Xee++Vp556Svr37y+pqanSv39/XQdERkZKrVq1JDMzU++HYRjStm1b6du3b5kXdHNTdt26deWpp56SunXriojIu+++K5mZmdKpUydJTEyUfv366cd35qVz586Smpoq7u7ukpaWJqmpqeLt7V3mSA3gzMVxwIABMn/+fPHz8xPDMGTIkCEyaNAgqVChgjz77LNSoUIFfQe8fv36Etvo3bu3voF58MEH9fcahiH169eXzMxMadOmjS5TIiKLFy8utZN1p06dJD8/X9dx//nPfyQ5OVmio6N12Zk3b568+OKL0q5dOxk1apSsX79eRES2bdsm06ZNk+XLl+t9MW/bx8fHpbVLlek777xTWrVqpUfTFO9AD5y5yVyyZIk8/PDDLq0yal03Nze58847ZfPmzXq/VD1rDmpmzJghK1askGeeeUaysrLkjjvu0OmePn269O7dW5ellJQU6d+/v64zcnNzZcaMGZKVlSVRUVESEBAgYWFh0rFjR+ncubMMHDhQpk6dWqLVVpWp22+/XV9nYmNjXQKs0lqfAwICpFWrVtKyZUt58MEHZdSoUTJ27Fi5/fbbpX79+vLuu+/KZ599pstc9erVpVatWiUe6/3888/6eL766qvy2GOP6ZtJFWx5eXmVaCFSr0+ZMkU/Hld1bOPGjcXd3V2mTZsmTzzxhFSoUEHq1asns2fPlry8PNm/f7+IiOzatUveeecdva/16tWTGjVqyJgxY+T48ePSq1cvqVChgn4EdakMEWtNj3jgwAEEBwfj+PHj+O2337B06VKEhYUhODgYS5YswaZNm3Dq1CmEhIQgLi4OGRkZaNGiBWy2f+baW7x4MZxOJ9LS0vRrK1euxHvvvYcdO3agd+/eaNq0KQICAly+e82aNfjuu+9wyy23wNPTE40aNcLcuXNRp04dDBkyBLNnz8b333+PvLw8fP311zh58iRq1KiBu+66q9T5UoqKijB9+nQsXrwYO3bswOHDh1GpUiXUr18ffn5++OCDD7Bv3z707NkT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RJbBwIWIiIgsg4ELEV03DMPADz/8UOb727Ztg2EYWLFixVVLExFdX9zPvQoR0dWxZ8+ec/56OxHd3Bi4ENF1IyIi4longYiuc3xURERXTbly5TBixAiX12rUqKEnDCv+qGjp0qVIS0uDh4cHateujT/++OPqJZaIrktscSGi69LRo0dx2223oXnz5vj888+xdetW9O/f/1oni4iuMQYuRHRdmjBhAoqKijBu3Dh4eHigSpUq2LlzJ/r06XOtk0ZE1xAfFRHRdWndunWoVq0aPDw89GsZGRnXMEVEdD1g4EJEV436wUezgoKCa5QaIrIiBi5EdNWEhobqX6kFgLy8PGzdurXUdStXroxVq1YhPz9fv7Z48eIrnkYiur4xcCGiq6ZJkyb47LPPMH/+fKxevRr33HMP3NzcSl23e/fuMAwDvXv3xtq1a/HTTz9h+PDhVznFRHS9YeBCRFfN4MGD0bBhQ9x2221o06YNOnTogPLly5e6ro+PD6ZMmYLVq1cjLS0Nzz77LN54442rnGIiut4YUvyBMxEREdF1ii0uREREZBkMXIiIiMgyGLgQERGRZTBwISIiIstg4EJERESWwcCFiIiILIOBCxEREVkGAxciIiKyDAYuREREZBkMXIiIiMgyGLgQERGRZfw/tgflvYVAbRsAAAAASUVORK5CYII=",
      "text/plain": [
       "<Figure size 640x480 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "n = test_.groupby('uid').agg({'label':'count'})\n",
    "idx = []\n",
    "a = test_.uid.unique()\n",
    "for x in m['uid'].values[:]:\n",
    "    if x in a:\n",
    "        idx.append(x)\n",
    "n.loc[idx].reset_index().plot(x='uid',kind='bar')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 61,
   "metadata": {},
   "outputs": [],
   "source": [
    "save_path = \"/data/zyang/datasets/ml-1m/\"\n",
    "train_ = pd.read_pickle(save_path+\"train_ood2.pkl\")\n",
    "valid_ = pd.read_pickle(save_path+\"valid_ood2.pkl\")\n",
    "test_ = pd.read_pickle(save_path+\"test_ood2.pkl\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 62,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(839, 3256)"
      ]
     },
     "execution_count": 62,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "max(train_.uid.max(),test_.uid.max(),valid_.uid.max())+1, max(train_.iid.max(),test_.iid.max(),valid_.iid.max())+1\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 63,
   "metadata": {},
   "outputs": [],
   "source": [
    "valid_small = pd.read_pickle(save_path+\"valid_small_ood2.pkl\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 64,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(833, 3249)"
      ]
     },
     "execution_count": 64,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "valid_small.uid.max(), valid_small.iid.max()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [],
   "source": [
    "import pandas as pd\n",
    "save_path = \"/data/zyang/datasets/ml-1m/\"\n",
    "# trai.to_pickle(save_path+\"train_ood2.pkl\")\n",
    "valid_ = pd.read_pickle(save_path+\"valid_ood2.pkl\")\n",
    "test_ = pd.read_pickle(save_path+\"test_ood2.pkl\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "0.6354196711854629"
      ]
     },
     "execution_count": 3,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "valid_.not_cold.mean()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "minigpt4",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.9.16"
  },
  "orig_nbformat": 4
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
